繁体   English   中英

C#6重载分辨率功能 <T1> &Func <T2>

[英]C#6 Overload Resolution Func<T1> & Func<T2>

我从这个问题中得知答案 :重载决议的改进是它包含了过载分辨率中lambda的返回类型。

在答案中链接网站上给出的示例给出了:

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中编译。

在我看来, 规范更改的相关部分这里:

7.5.3.5更好的转换目标

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

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

在您的第二个示例中,仍然存在歧义,这是因为转换不符合所述的任何要求。 这两种委托类型不是 void -returning,也不委托类型的返回类型比其他“更好”。 也就是说, int不是“比”更好的string

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

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM