C#编译器抱怨函数与自身存在歧义

3

我在一个继承来的C# WebApp项目中工作。以下是一些函数定义...

public static DataTable ExecuteDT(this AppDBContext target, string sql, int timeoutSeconds = defaultTimeoutSeconds) {
    DbCommand cmd = target.Database.Connection.CreateCommand();
    cmd.CommandText = sql;
    cmd.CommandType = System.Data.CommandType.Text;
    if (timeoutSeconds != defaultTimeoutSeconds) cmd.CommandTimeout = timeoutSeconds;

    DataTable rv = new DataTable();
    rv.Load(cmd.ExecuteReader());
    return rv.Copy();
}

public static object ExecuteDR(this AppDBContext target, string sql, int timeoutSeconds = defaultTimeoutSeconds) {
    DataTable dt = target.ExecuteDT(sql, timeoutSeconds);
    return (ReferenceEquals(dt, null) || dt.Rows.Count == 0) ? null : dt.Rows[0];
}

当我对应用程序进行构建时,它能够编译并且没有任何错误。
然而,当我尝试运行该网站(使用F5),它会在浏览器中启动,但随后出现编译错误:

Compiler Error Message: CS0121: The call is ambiguous between the following methods or properties: 
'ConstructionLoan.WebFormsApp.DataExtensions.ExecuteDT(ConstructionLoan.Domain.Data.AppDBContext, string, int)' and 
'ConstructionLoan.WebFormsApp.DataExtensions.ExecuteDT(ConstructionLoan.Domain.Data.AppDBContext, string, int)'

Source Error:

Line 34: 
Line 35:         public static object ExecuteDR(this AppDBContext target, string sql, int timeoutSeconds = defaultTimeoutSeconds) {
Line 36:             DataTable dt = target.ExecuteDT(sql, timeoutSeconds);
Line 37:             return (ReferenceEquals(dt, null) || dt.Rows.Count == 0) ? null : dt.Rows[0];
Line 38:         }


Source File: c:\Users\myuser\Source\Workspaces\ourclient\src\Web\Main\ConstructionLoan.WebFormsApp\App_Code\DataExtensions.cs    Line: 36 

它抱怨同一个函数存在二义性。我已经通过所有源代码进行了搜索,这是这个函数的唯一声明,所以我真的很困惑编译器为什么会感到困惑。
在Google上我找到的唯一一个类似的问题是某人的项目不知何故引用了自身。我再次检查确保该项目没有引用自己,但实际上并没有引用。
我也尝试过清理和重新构建这个项目,但不知何故,在IDE中编译正常,但在浏览器中运行时就失败了。
我使用VS2015,并针对框架的4.5.2版本进行目标设置。

3
你尝试过删除“Temporary ASP.NET files”文件夹中的内容吗?有时旧版本的DLL文件会卡在那里,这会干扰编译器在处理新的二进制文件时所需的操作。 - xxbbcc
FYI:App_Code文件夹中的源文件将在运行时由ASP.NET编译。"您可以将源代码存储在App_Code文件夹中,它将在运行时自动编译。" 您还可以使用ASP.NET编译工具预先编译这些文件。 - KiwiPiet
2
算了,我读错了方法名。 - KiwiPiet
@xxbbcc @JosephStyons - 我找到了两个版本,... 显然本地 IIS Express 将其临时 asp 文件存储在不同的位置... C:\Users\myuser\AppData\Local\Temp\Temporary ASP.NET Files。不幸的是,删除它们并让文件重新生成并没有帮助。 - eidylon
2
尝试删除您的 bin 和 obj 文件夹,然后重新构建。有时候清理操作并不足够。 - hatchet - done with SOverflow
显示剩余4条评论
1个回答

0

显然,这与 App_Code 文件夹有关。

似乎 App_Code 文件夹中的任何内容都会被编译成 DLL,并在运行时保留在那里并进行编译。 因此,在运行时加载了同一命名空间中的两个类的副本,因此出现了错误。

我将所有位于 App_Code 中的文件移动到一个新的非 ASP.NET 特殊文件夹中,现在该错误已消失。


旧答案,但我遇到了不同的解决方法。检查项目的引用。对我来说,问题在于导入NuGet包后,引用被更新为包含对项目本身的引用。我删除了该引用,错误消失了。 - user3352617

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接