Tag: 过载分辨率

为什么编译器不能在这种重载决策情况下告诉更好的转换目标? (协方差)

理解关于重载决策的C#语言规范显然很难,现在我想知道为什么这个简单的情况失败了: void Method(Func f) { } void Method(Func f) { } void Call() { Method(() => { throw new NotSupportedException(); }); } 这给出了编译时错误CS0121, 以下方法或属性之间的调用是不明确的:后面是我的两个Method函数成员(重载)。 我所期望的是Func是一个比Func 更好的转换目标 ,然后应该使用第一个重载。 自.NET 4和C#4(2010)以来,generics委托类型Func在TResult一直是协变的,因此从Func到Func存在隐式转换,而显然没有隐式转换可以从Func到Func 。 那么它会使Func成为更好的转换目标,而重载决策应该选择第一次重载? 我的问题很简单:我在这里错过了C#规范的哪一部分? 增加:这很好用: void Call() { Method(null); // OK! }