c# - 函数的协变分配需要显式参数

标签 c# generics covariance

您可以将方法分配给具有匹配类型参数的委托(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 表达式,带有从 DateTimeobject 的隐式装箱转换。

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

Func<string, object> f = string.Intern;

关于c# - 函数的协变分配需要显式参数,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/19411147/

相关文章:

c# - 以特定顺序编写 XML 属性和命名空间声明

c# - 使用任何 CPU 集编译 C# 应用程序可以处理大 (>2GB) 地址

java - Java中如何传递泛型参数

c# - 泛型继承......不起作用

c# - 双协方差

c# - 为什么我需要协方差接口(interface)(输出类型)?

c# - 在 Windows 服务中,如果 OnStart 被阻止,OnStop 是否会运行?

c# - 在 C# 中有效地过滤一个 DataTable 匹配另一个 DataTable 的多个列

java - Field.getGenericType() 返回 java.lang.Class 的实例而不是 Type

excel - 使用 Excel 计算协方差矩阵