当只有一个具有给定名称的方法时,Visual Studio会声明存在不明确的调用

问题描述 投票:1回答:3

我想弄清楚为什么会这样,但我不能。我有一个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;
}

在我看来,解决方案与扩展方法有一些问题,我不知道为什么。我成功构建了几次,试图清理它 - 一切正常,直到我尝试使用扩展方法作为扩展方法,而不是静态方法。

c# wcf compilation
3个回答
3
投票

当Visual Studio将项目引用到自身时(不知道为什么),我发生了类似的事情。我能够解决它只是删除无意义的参考。


2
投票

我找到了这个问题的解决方案,它对我有用。这是非常令人不安的,但你可以阅读完整的答案here

WAP不支持App_Code。 App_Code文件夹在运行时编译; WAP中的所有代码都是在编译/开发时编译的。因此,当您向WAP添加App_Code文件夹时。你最终得到了重复的代码;例如,App_Code中定义的类也将显示在wap DLL中。修复很简单:只需将文件夹命名为Classes或CodeFiles。

顺便说一句,感谢所有试图帮助我的人:)


0
投票

错误消息显示您有2个具有相同名称和签名的方法。

您需要从特定类调用它或为它们提供不同的命名空间。调用者对您尝试使用的扩展方法感到困惑,我相信下一版本的C#将允许您在调用扩展方法时指定命名空间。

如果其中一个实际上不再存在,那么请确保您再次清理并再次构建以尝试去除任何剩余物。

© www.soinside.com 2019 - 2024. All rights reserved.