C#6过载分辨率Func <t1>&amp; FUNC <T2>

时间:2017-03-18 17:19:19

标签: c# .net c#-6.0

我从this question\answer得知,重载决议的改进是它包含了过载分辨率中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中编译。

我尝试过更改不同类型的函数:

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

private void Foo(Func<string> func)
{

}

private int Bar()
{
    return 1;
}

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

尽管Func返回了不同的值,但这不能在C#6中编译。

1 个答案:

答案 0 :(得分:1)

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

  

7.5.3.5更好的转换目标

     

给定两种不同类型T1和T2,如果是,则T1是比T2更好的转换目标   ...
  •T1是委托类型D1或表达式树类型表达式&lt; D1&gt;,T2是委托类型D2或表达式树类型表达式&lt; D2&gt;,D1具有返回类型S1并且以下之一成立:
  ◦D2无效返回
  ◦D2的返回类型为S2,S1是比S2
更好的转换目标   ...

请注意void - 返回委托类型是特殊的。因此,在新规则中,Func<int>是一个更好的转化目标&#34;而不是Action,因为Actionvoid - 正在返回。

在您的第二个示例中,仍然存在歧义,这是因为转换不符合所述的任何要求。两个委托类型都 void - 返回,并且委托类型的返回类型都不是&#34;更好&#34;比另一个。也就是说,int并不比&#34;更好。 string

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