您可以将方法分配给具有匹配类型参数的委托(delegate):
Func<string, DateTime> f = DateTime.Parse;
您可以将 lambda 分配给具有协变类型参数的委托(delegate):
Func<string, object> f = s => DateTime.Parse(s);
但是您不能将方法分配给具有协变类型参数的委托(delegate):
Func<string, object> f = DateTime.Parse; //ERROR: has the wrong return type
为什么不呢?
最佳答案
变体不适用于值类型,因为它们需要以不同方式进行 JIT。
您的 lambda 表达式变体不涉及方差;相反,它编译为一个 lambda 表达式,带有从 DateTime
到 object
的隐式装箱转换。
如果您使用返回引用类型的方法,它工作正常:
Func<string, object> f = string.Intern;
关于c# - 函数的协变分配需要显式参数,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/19411147/