C#6改进了重载决策 - 澄清?

时间:2016-01-31 13:20:19

标签: c# c#-6.0

在C#6的所有新功能中,最神秘的功能(对我来说)是“改进的重载分辨率”

也许是因为我couldn't find有关它的相关信息/示例/说明。

  

未讨论的其余两个功能是支持定义   自定义添加扩展方法以帮助收集初始值设定项,   一些较小但改进的重载决策

查看roslyn wiki

  

重载分辨率有很多小的改进,其中   可能会导致更多事情按照您的预期运作   他们来。这些改进都与“更好”有关 - 就是这种方式   编译器决定给定的两个重载中的哪一个更好   参数。

所以我问:

问题

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

1 个答案:

答案 0 :(得分:19)

我认为这里的意思是“更好的”更好的规则documented in the 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);        
    }
}

使用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<long>> func) {}
    static void Foo(Func<Func<int>> func) {}

    static void Main()
    {
        Foo(() => () => 7);
    }
}