C#6 改进的重载分辨率 - 澄清
本文关键字:分辨率 澄清 重载 C#6 | 更新日期: 2023-09-27 18:32:34
在C#6的所有新功能中,最神秘的功能(对我来说(是"改进的重载分辨率"。
也许是因为我找不到相关信息/示例/解释。
唯一未讨论的剩余两个功能是支持定义 自定义添加扩展方法以帮助集合初始值设定项, 和一些轻微但改进的过载分辨率
查看罗斯林维基
对重载分辨率有许多小的改进,这些改进 可能会导致更多事情按照您期望的方式工作 他们到。这些改进都与"更好"有关——就像 编译器决定两个重载中哪一个更适合给定的重载 论点。
所以我问:
问题:
改进的重载分辨率究竟如何在 C#6 中发挥作用?以及它与 C#5 有何不同(示例?文档?
我相信这里的意思是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);
}
}