Visual Studio声明存在一个不明确的调用,当存在';这只是一个具有给定名称的方法
本文关键字:一个 存在 方法 定名称 不明确 声明 Studio 调用 Visual | 更新日期: 2023-09-27 18:08:03
我试图弄清楚为什么会发生这种情况,但我做不到。我有一个WCF服务,在里面我创建了一个名为ExtensionUtil的类,它将只由扩展方法组成。
目前,我在ExtensionUtil类中拥有的唯一方法是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引用一个项目时,我也遇到了类似的事情(不知道为什么(。我可以简单地删除无意义的引用来解决它。
我找到了这个问题的解决方案,它对我很有效。这很令人不安,但你可以在这里阅读完整的答案。
WAP中不支持App_Code。App_Code文件夹是在运行时编译的;WAP中的所有代码都是在编译/开发时编译的。因此,当您将App_Code文件夹添加到WAP时。你最终会得到重复的代码;例如,在App_Code中定义的类也将显示在wap DLL中。修复方法很简单:只需将文件夹命名为其他名称,如Classes或CodeFiles。
顺便说一句,感谢所有试图帮助我的人:(
错误消息显示您有两个具有相同名称和签名的方法。
您需要从特定的类中调用它,或者为它们提供不同的名称空间。调用者对您尝试使用的扩展方法感到困惑,我相信C#的下一个版本将允许您在调用扩展方法时指定命名空间。
如果其中一个已经不存在了,那么一定要重新清洁和建造,试着清除任何剩余的东西。