为什么.NET 4中的差异仅支持引用类型?

时间:2010-06-16 20:21:12

标签: .net-4.0

.NET 4支持协方差和反方差。但是,仅支持引用类型,而不支持值类型。那是为什么?

3 个答案:

答案 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)

两种形式的方差都是根据继承来定义的:值类型不是继承的。