我从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中编译。
答案 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
,因为Action
是void
- 正在返回。
在您的第二个示例中,仍然存在歧义,这是因为转换不符合所述的任何要求。两个委托类型都不 void
- 返回,并且委托类型的返回类型都不是&#34;更好&#34;比另一个。也就是说,int
并不比&#34;更好。 string
。
请注意,int
&#34;优于&#34; object
。因此,如果您将Func<string>
更改为Func<object>
,编译器就可以选择,您不会再收到错误。