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

本文关键字:分辨率 澄清 重载 C#6 | 更新日期: 2023-09-27 18:32:34

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

也许是因为我找不到相关信息/示例/解释。

唯一未讨论的剩余两个功能是支持定义 自定义添加扩展方法以帮助集合初始值设定项, 一些轻微但改进的过载分辨率

查看罗斯林维基

重载分辨率有许多小的改进,这些改进 可能会导致更多事情按照您期望的方式工作 他们到。这些改进都与"更好"有关——就像 编译器决定两个重载中哪一个更适合给定的重载 论点。

所以我问:

问题

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

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

我相信这里的意思是Roslyn github存储库中记录的"更好的更好"规则。

示例代码:

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' 中(,这会产生两个错误:

测试.cs(11,9(: 错误 CS0121: 调用在以下方法或属性之间不明确:
     'Test.Foo(System.Action(' 和 'Test.Foo(System.Func('
测试.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);
    }
}