我想弄清楚为什么会这样,但我不能。我有一个WCF服务,在其中我创建了一个名为ExtensionUtil的类,它只包含扩展方法。
目前,我在ExntensionUtil类中使用的唯一方法是AddWithNullableValue。它看起来像这样:
public static void AddWithNullableValue(this SqlParameterCollection paramCollection, string paramName, object value)
{
SqlParameter param = new SqlParameter();
param.ParameterName = paramName;
param.Value = value == null ? DBNull.Value : value;
paramCollection.Add(param);
}
我在DAL中使用此方法,如下所示:
sqlCommand.Parameters.AddWithNullableValue("@categoryId", publication.CategoryId);
一切都很好。但是,当我尝试启动该服务时,发生编译错误,说明:
The call is ambiguous between the following methods or properties:
'App_Code.Util.ExtensionUtil.AddWithNullableValue(System.Data.SqlClient.SqlParameterCollection, string, object)' and
'App_Code.Util.ExtensionUtil.AddWithNullableValue(System.Data.SqlClient.SqlParameterCollection, string, object)'
为什么会这样?我只有一个这个名字的方法,编译器说这个调用是不明确的。
编辑:
当我在SqlParameterCollection参数前面删除'this'关键字时,使该方法成为普通的静态方法,而不是扩展方法,一切正常。此外,我查看了整个解决方案(使用Ctrl + Shift + F)来查找“AddWithNullableValues”关键字的所有匹配项,搜索结果如下:方法的签名和我调用它的代码中的两个位置。然后,我甚至创建了一个全新的静态类,添加了相同的方法,使用完全不同的名称和相同的主体,当我调用它时,我仍然遇到相同的错误,所以问题必须是别的。
最后,我需要另一种扩展方法,当我在我的代码中调用它时,我得到了相同的错误。
public static Nullable<T> GetNullableValue<T>(this SqlDataReader sqlDataReader, string columnName) where T : struct
{
int columnIndex = sqlDataReader.GetOrdinal(columnName);
Nullable<T> value = null;
if (!sqlDataReader.IsDBNull(columnIndex))
{
value = (Nullable<T>)sqlDataReader.GetValue(columnIndex);
}
return value;
}
在我看来,解决方案与扩展方法有一些问题,我不知道为什么。我成功构建了几次,试图清理它 - 一切正常,直到我尝试使用扩展方法作为扩展方法,而不是静态方法。
当Visual Studio将项目引用到自身时(不知道为什么),我发生了类似的事情。我能够解决它只是删除无意义的参考。
我找到了这个问题的解决方案,它对我有用。这是非常令人不安的,但你可以阅读完整的答案here。
WAP不支持App_Code。 App_Code文件夹在运行时编译; WAP中的所有代码都是在编译/开发时编译的。因此,当您向WAP添加App_Code文件夹时。你最终得到了重复的代码;例如,App_Code中定义的类也将显示在wap DLL中。修复很简单:只需将文件夹命名为Classes或CodeFiles。
顺便说一句,感谢所有试图帮助我的人:)
错误消息显示您有2个具有相同名称和签名的方法。
您需要从特定类调用它或为它们提供不同的命名空间。调用者对您尝试使用的扩展方法感到困惑,我相信下一版本的C#将允许您在调用扩展方法时指定命名空间。
如果其中一个实际上不再存在,那么请确保您再次清理并再次构建以尝试去除任何剩余物。