【问题标题】:Why is this method invocation ambiguous?为什么这个方法调用不明确?
【发布时间】:2019-11-18 22:26:22
【问题描述】:

为什么下面对Foo 的第一次调用会编译,而第二次调用会导致模棱两可的调用编译器错误?

(使用 c# 7.2)

    private static void AmbiguousAsyncOverload() {
      Foo(() => Bar());  // This is OK
      //Foo(Bar);        // Error, ambiguous overload
    }

    private static void Foo(Func<int> func) {
      func();
    }

    private static void Foo(Func<string> func) {
      func();
    }

    private static int Bar() {
      return 4;
    }

如果我删除了 Foo 的第一个 (Func&lt;int&gt;) 实现,因此可能存在歧义,那么编译器(正确地)报告 Bar 没有正确的签名来传递给 @987654328 @,这意味着它有足够的信息来解决歧义。

如果编译器在重载解析期间没有查看返回值,因此两个调用都失败了,我会理解,但我的问题是为什么一个调用编译正常,而另一个调用没有。

【问题讨论】:

标签: c# roslyn c#-7.2


【解决方案1】:

这是所有 C# 版本的 issue,直到它在 v7.3 中得到修复。在重载解析期间未考虑返回类型。来自 C# 7.3 的 release notes(或 language proposal):

  1. 对于方法组转换,从集合中删除返回类型与委托的返回类型不匹配的候选方法。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2014-11-18
    • 1970-01-01
    • 2016-05-18
    • 1970-01-01
    • 2013-07-09
    • 2020-06-14
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多