4

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

Func<string, DateTime> f = DateTime.Parse;

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

Func<string, object> f = s => DateTime.Parse(s);

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

Func<string, object> f = DateTime.Parse; //ERROR: has the wrong return type

为什么不?

4

1 回答 1

7

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

您的 lambda 表达式变体不涉及方差;相反,它编译为一个 lambda 表达式,其中包含从DateTimeto的隐式装箱转换object

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

Func<string, object> f = string.Intern;
于 2013-10-16T18:37:34.000 回答