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
“更好的转换目标”,因为Action
是void
-returning.
在你的第二个例子中,仍然存在歧义,那是因为转换不满足规定的任何要求。两种委托类型都是 not void
-returning,并且两种委托类型的 return 类型都不比另一种“更好”。也就是说,int
并不“优于”string
.
请注意 int
“优于”object
。因此,如果您将 Func<string>
更改为 Func<object>
,编译器可以选择并且您不会再收到错误。
我从
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
“更好的转换目标”,因为Action
是void
-returning.
在你的第二个例子中,仍然存在歧义,那是因为转换不满足规定的任何要求。两种委托类型都是 not void
-returning,并且两种委托类型的 return 类型都不比另一种“更好”。也就是说,int
并不“优于”string
.
请注意 int
“优于”object
。因此,如果您将 Func<string>
更改为 Func<object>
,编译器可以选择并且您不会再收到错误。