[英]Is it possible to overload Func<T, TResult> and Func<T1, T2, TResult> having the same name?
[英]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
更好的转换目标,因为Action
是void
-returning。
在您的第二个示例中,仍然存在歧义,这是因为转换不符合所述的任何要求。 这两种委托类型不是 void
-returning,也不委托类型的返回类型比其他“更好”。 也就是说, int
不是“比”更好的string
。
请注意, int
是 “优于” object
。 因此,如果您将Func<string>
更改为Func<object>
,编译器就可以选择并且您不再收到错误。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.