.NET 4支持协变和逆变。但是,只支持引用类型,不支持值类型。为什么会这样呢?
发布于 2010-06-17 04:26:24
基本上,CLR需要知道它可以将“源”类型的值视为“目标”类型的值,而无需执行任何额外的转换-简单地说,源值的位模式必须是有效的目标值。表示必须是相同的。否则,CLR将需要额外的信息来在正确的时间执行正确的转换。
Eric Lippert写了一篇关于representation and identity的博客--更多信息请看这篇文章(一如既往:)。
发布于 2010-06-17 17:42:00
Jon是对的;只是在这一点上稍作扩展。假设你有
Func<int> f1 = ()=>2;
Func<object> f2 = f1;
object o1 = f1();
object o2 = f2();假设这是合法的。编译器生成装箱指令;第三行实际上是:
object o1 = BoxIntegerToObject(f1());显然,存储在o2中的结果应该是一个装箱的整数。拳击指南在哪里?它不能在调用f2之后,因为那个东西肯定已经返回了一个对象。它不能出现在对f2的调用中,因为对f2的调用实际上是对f1的调用,而f1保证返回一个未装箱的整数。
所以装箱指令不能在调用返回之后发生,也不能在调用返回之前发生,因此根本不可能发生,因此这肯定是非法的。不存在从Func<int>到Func<object>的引用转换。
发布于 2010-06-17 04:25:54
这两种形式的方差都是根据继承来定义的:值类型不会被继承。
https://stackoverflow.com/questions/3056888
复制相似问题