为什么这个方法调用不明确?
Why is this method invocation ambiguous?
为什么第一次调用下面的 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<int>
) 实现,因此可能存在歧义,那么编译器(正确地)报告 Bar
没有要传递给 Foo
的正确签名,这意味着它有足够的信息来解决歧义。
如果编译器在重载解析期间没有查看 return 值并因此两个调用都失败,我会理解,但我的问题是为什么一个调用编译正常而另一个调用没有。
这是 C# 7.3 的 issue for all versions of C# up until it was fixed in v7.3. Return types were not taken into account during overload resolution. From the release notes (or the language proposal):
- For a method group conversion, candidate methods whose return type doesn't match up with the delegate's return type are removed from the set.
为什么第一次调用下面的 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<int>
) 实现,因此可能存在歧义,那么编译器(正确地)报告 Bar
没有要传递给 Foo
的正确签名,这意味着它有足够的信息来解决歧义。
如果编译器在重载解析期间没有查看 return 值并因此两个调用都失败,我会理解,但我的问题是为什么一个调用编译正常而另一个调用没有。
这是 C# 7.3 的 issue for all versions of C# up until it was fixed in v7.3. Return types were not taken into account during overload resolution. From the release notes (or the language proposal):
- For a method group conversion, candidate methods whose return type doesn't match up with the delegate's return type are removed from the set.