C#6改进了重载分辨率 – 澄清?

在C#6的所有新function中,最神秘的function(对我而言)是“改进的重载分辨率”

也许是因为我无法找到有关它的相关信息/示例/解释。

剩下的两个未讨论的function是支持定义自定义Add扩展方法以帮助收集初始化器, 以及一些次要但改进的重载决策

看着roslyn维基

重载决策有许多小的改进,这可能会导致更多的东西按照你期望的方式工作。 这些改进都与“更好”有关 – 编译器决定哪两个重载对于给定参数更好。

所以我问:

问题

改进的重载分辨率究竟如何在C#6中发挥作用? 它与C#5的不同之处(示例?文档?)

我相信这里的意思是“更好的更好”规则,这些规则在Roslyn github repo中有记录 。

示例代码:

using System; class Test { static void Foo(Action action) {} static void Foo(Func func) {} static int Bar() { return 1; } static void Main() { Foo(Bar); } } 

使用C#5编译器(例如在c:\Windows\Microsoft.NET\Framework\v4.0.30319\ ),这会产生两个错误:

Test.cs(11,9):错误CS0121:以下方法或属性之间的调用不明确:
‘Test.Foo(System.Action)’和’Test.Foo(System.Func)’
Test.cs(11,13):错误CS0407:’int Test.Bar()’的返回类型错误

使用C#6编译器,它编译得很好。

同样地使用lambda表达式的精确匹配,这会使用C#5编译器生成不明确的重载错误,但不会对C#6生成错误:

 using System; class Test { static void Foo(Func> func) {} static void Foo(Func> func) {} static void Main() { Foo(() => () => 7); } }