【发布时间】: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<int>) 实现,因此可能存在歧义,那么编译器(正确地)报告 Bar 没有正确的签名来传递给 @987654328 @,这意味着它有足够的信息来解决歧义。
如果编译器在重载解析期间没有查看返回值,因此两个调用都失败了,我会理解,但我的问题是为什么一个调用编译正常,而另一个调用没有。
【问题讨论】:
-
@DavidG dotnetfiddle.net/iztplI
-
@DavidG 我只能在 c# 7.2 上重现它
-
但是,try.dot.net 不会报告歧义。
-
是的,这只是 7.2(或更早版本)的问题,而不是问题所暗示的 7.3。 @eoin 你能确认你的编译器版本吗?
-
此问题已在 C# 7.3 (docs.microsoft.com/en-us/dotnet/csharp/whats-new/…) 中修复