C#6 重载解析 Func<T1> & Func<T2>

C#6 Overload Resolution Func<T1> & Func<T2>

我从 了解到,重载解析的改进在于它在重载解析中包含了 return 类型的 lambda。

site linked in the answer 上给出的例子给出了这个:

class Program
{
    private static void TakesItem(Action item)
    {

    }
    private static int TakesItem(Func<int> item)
    {
        return item();
    }
    public static int somefunction()
    {
        return 50;
    }
    static void Main(string[] args)
    {
        int resultitem = TakesItem(somefunction);
        Console.WriteLine(resultitem);
        Console.ReadKey();
    }
}

此代码将在版本 6 而不是版本 5 中编译。

我试过改变它的功能return不同类型:

private void Foo(Func<int> func)
{
}

private void Foo(Func<string> func)
{

}

private int Bar()
{
    return 1;
}

[Test]
public void Example()
{
    Foo(Bar);
}

尽管 Func return 使用了不同的值,但它无法在 C# 6 中编译。

在我看来the specification changes的相关部分在这里:

7.5.3.5 Better conversion target

Given two different types T1 and T2, T1 is a better conversion target than T2 if

•T1 is either a delegate type D1 or an expression tree type Expression<D1>, T2 is either a delegate type D2 or an expression tree type Expression<D2>, D1 has a return type S1 and one of the following holds:
◦D2 is void returning
◦D2 has a return type S2, and S1 is a better conversion target than S2

请注意 void-returning 委托类型是特殊情况。所以在新规则中,Func<int>是比Action“更好的转换目标”,因为Actionvoid-returning.

在你的第二个例子中,仍然存在歧义,那是因为转换不满足规定的任何要求。两种委托类型都是 not void-returning,并且两种委托类型的 return 类型都不比另一种“更好”。也就是说,int 并不“优于”string.

请注意 int “优于”object。因此,如果您将 Func<string> 更改为 Func<object>,编译器可以选择并且您不会再收到错误。