【问题标题】:C#6's Improved overload resolution - clarification?C#6 改进的重载分辨率 - 澄清?
【发布时间】:2016-05-08 22:41:32
【问题描述】:

在 C#6 的所有新特性中,(对我而言)最神秘的特性是“改进的重载解析”

也许是因为我couldn't find 相关信息/示例/解释。

剩下的两个没有讨论的特性是支持定义 一个自定义的 Add 扩展方法来帮助集合初始化器, 一些较小但改进的重载解决方案

看着roslyn wiki

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

所以我问:

问题

改进的重载解析究竟是如何在 C#6 中发挥作用的? 如何它与 C#5 不同(示例?文档?)

【问题讨论】:

标签: c# c#-6.0


【解决方案1】:

我相信这里的意思是“更好的更好”规则,即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): error 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);
    }
}

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2011-02-11
    • 1970-01-01
    • 2019-12-16
    • 1970-01-01
    • 2014-01-16
    • 1970-01-01
    • 2011-03-04
    相关资源
    最近更新 更多