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

Roy*_*mir 19 c# c#-6.0

在C#6的所有新功能中,最神秘的功能(对我而言)是"改进的重载分辨率".

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

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

看着roslyn维基

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

所以我问:

问题:

改进的重载分辨率究竟是如何在C#6中发挥作用的?和如何它是从C#5不同(实施例?文档?)

Jon*_*eet 20

我相信这里的意思是"更好的更好"规则,这些规则记录在Roslyn github repo中.

示例代码:

using System;

class Test
{
    static void Foo(Action action) {}
    static void Foo(Func<int> func) {}
    static int Bar() { return 1; }

    static void Main()
    {
        Foo(Bar);        
    }
}
Run Code Online (Sandbox Code Playgroud)

使用C#5编译器(例如in 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<long>> func) {}
    static void Foo(Func<Func<int>> func) {}

    static void Main()
    {
        Foo(() => () => 7);
    }
}
Run Code Online (Sandbox Code Playgroud)