为什么此方法调用不明确?

时间:2019-07-09 11:12:18

标签: c# roslyn c#-7.2

为什么下面对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;
    }

如果我删除了Func<int>的第一个(Foo)实现,并因此消除了歧义的可能性,那么编译器(正确)会报告Bar没有正确的签名传递给Foo,这意味着它具有足够的信息来解决歧义。

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

1 个答案:

答案 0 :(得分:6)

在v7.3中修复之前,这是所有C#版本的issue。重载解析期间未考虑返回类型。对于C#7.3,从release notes(或language proposal)开始:

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