对Func的协变分配需要显式参数

Dan*_*iel 4 c# generics covariance

您可以将方法分配给具有匹配类型args的委托:

Func<string, DateTime> f = DateTime.Parse;
Run Code Online (Sandbox Code Playgroud)

您可以将lambda分配给具有协变类型args的委托:

Func<string, object> f = s => DateTime.Parse(s);
Run Code Online (Sandbox Code Playgroud)

但是您不能将方法分配给具有协变类型args的委托:

Func<string, object> f = DateTime.Parse; //ERROR: has the wrong return type
Run Code Online (Sandbox Code Playgroud)

为什么不?

SLa*_*aks 7

方差不适用于值类型,因为它们需要以不同方式进行JIT.

您的lambda表达式变体不涉及方差; 相反,它编译为一个lambda表达式与隐式装箱转换DateTimeobject.

如果您使用返回引用类型的方法,它可以正常工作:

Func<string, object> f = string.Intern;
Run Code Online (Sandbox Code Playgroud)