【问题标题】:compiler build error : The call is ambiguous between the following methods or properties编译器构建错误:以下方法或属性之间的调用不明确
【发布时间】:2011-10-04 08:11:03
【问题描述】:

我在使用扩展方法时遇到了奇怪的编译器错误。我有一个具有扩展方法的程序集,例如

public static class MyClass
{
    public static Bar GetBar(this Foo foo)
    {
        return new Bar();
    }
}

在同一个程序集的其他地方我做这样的事情

Foo foo = new Foo();
var bar = foo.GetBar();

当我清理和编译一切正常。但是一旦我在程序集中做了一个小改动(比如一个额外的空格)并再次构建,我就会收到这样的错误:

错误 973 以下方法或属性之间的调用不明确:'MyNameSpace.MyClass.GetBar(Foo)' 和 'MyNameSpace.MyClass.GetBar(Foo)'

只有在我清理项目后,我才能再次构建。这是使用旧版本程序集的编译器中的问题吗?我现在看到的唯一解决方法是用普通的静态方法替换我的扩展方法。

【问题讨论】:

  • 那么它的变化不是很小
  • 它是.. 只是一个输入或其他东西让项目再次构建
  • 这个项目有哪些参考资料?您是否有可能间接地引用了同一个程序集?
  • 就是这样!不知何故,该项目直接引用了自己。删除引用可能会解决问题。谢谢!
  • 如果你有一个 Web 应用程序项目而不是一个网站项目呢?在这种情况下,VS 在 bin 文件夹中创建一个与项目同名的程序集。我的项目会构建得很好,但是当我运行它时会抱怨方法不明确。 :(

标签: c# .net-3.5 compiler-construction build


【解决方案1】:

我花了一些时间才弄清楚这一点,但 Gluips 评论是正确的,我将在此处添加以方便参考:

就是这样!不知何故,该项目直接引用了自己。 删除引用可能会解决问题。谢谢!

这为我解决了问题。

【讨论】:

  • 你能补充更多细节吗?
  • 我已经有一段时间没有回答他了,但我是这样的:Dll A 引用 B,B 引用 C,C 引用 A。
  • 不幸的是,ReSharper 有时会这样做。 :(
  • 对我来说,不是A引用B,B引用C,C引用A,而是A引用A本身。我删除了这个引用,然后一切都很好。我也在使用 Resharper,所以这可能是奇怪的根源。
  • 我最近遇到过这种情况 - 就我而言,我发现编译器警告很有用,因为它们列出了定义不明确目标方法的不同位置。
【解决方案2】:

好吧,玩了几轮之后,我可以通过向输出文件添加文件引用来重现与此类似的情况 - 第一次成功构建(因为没有使用引用 - 你只需得到一个“引用未解决”警告),但是从这一点开始,我看到代码编辑器中出现“调用不明确”错误。

然而,对我来说,这并不妨碍我构建解决方案(我正在使用 Visual Studio 2010 对此进行测试),但是确实会出现错误 - 可能在稍微不同的情况下,例如不同的 Visual Studio 版本,这会停止编译项目。

您还可以通过复制输出程序集的构建后步骤来设计相同的情况。

【讨论】:

    【解决方案3】:

    我无法解释这种行为,但您应该直接在Foo 类中将这种方法实现为静态。

    【讨论】:

      【解决方案4】:

      我在使用 MSBuild v14 编译时出现了这种行为:

      • 在 VS 2015 中构建工作正常
      • MSBuild 在同一台机器上构建也可以工作
      • 在仅预装了 MSBuild 的服务器计算机上构建失败

      安装 .NET 开发人员包(在我的情况下为 Developer Pack for 4.5.2)解决了这个问题,即使错误消息具有误导性。

      【讨论】:

        猜你喜欢
        • 2014-04-08
        • 1970-01-01
        • 2010-11-19
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2012-02-09
        • 2020-01-19
        相关资源
        最近更新 更多