.NET 4支持协方差和反方差。但是,仅支持引用类型,而不支持值类型。那是为什么?
答案 0 :(得分:7)
基本上CLR需要知道它可以将“源”类型的值视为“目标”类型的值而不执行任何额外的转换 - 简单地说,源值的位模式必须作为目标值有效。 表示必须相同。否则,CLR需要有额外的信息才能在正确的时间执行正确的转换。
Eric Lippert撰写了关于representation and identity的博文 - 请参阅该帖子以获取更多信息(如有):
答案 1 :(得分:3)
Func<int> f1 = ()=>2;
Func<object> f2 = f1;
object o1 = f1();
object o2 = f2();
假设这是合法的。编译器生成装箱指令;第三行是有效的:
object o1 = BoxIntegerToObject(f1());
显然,存储在o2中的结果应该是一个盒装的int。 拳击教学在哪里?它不能在调用f2之后,因为那个东西保证已经返回一个对象。它不能在f2的调用中,因为对f2的调用实际上是对f1的调用,而f1保证它返回 unboxed int。
因此,在调用返回后,不会发生装箱指令,并且在调用返回之前不会发生,因此它根本不会发生,因此必须是非法。没有Func<int>
到Func<object>
的引用转换。
答案 2 :(得分:2)
两种形式的方差都是根据继承来定义的:值类型不是继承的。