您可以将方法分配给具有匹配类型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
为什么不呢?
答案 0 :(得分:7)
方差不适用于值类型,因为它们需要以不同方式进行JIT。
您的lambda表达式变体不涉及方差;相反,它使用从DateTime
到object
的隐式装箱转换编译为lambda表达式。
如果使用返回引用类型的方法,则可以正常工作:
Func<string, object> f = string.Intern;