.net 4.0 为什么.NET4中的variance只支持引用类型?
.NET4支持协方差和逆变。但是,仅支持引用类型,不支持值类型。这是为什么?这两种形式的差异都是根据继承定义的:值类型不是继承的。基本上,CLR需要知道,它可以将“源”类型的值视为“目标”类型的值,而无需执行任何额外的转换——简单地说,源值的位模式必须作为目标值有效。表述必须相同。否则,CLR需要有额外的信息才能在正确的时间执行正确的转换.net 4.0 为什么.NET4中的variance只支持引用类型?,.net-4.0,.net 4.0,.NET4支持协方差和逆变。但是,仅支持引用类型,不支持值类型。这是为什么?这两种形式的差异都是根据继承定义的:值类型不是继承的。基本上,CLR需要知道,它可以将“源”类型的值视为“目标”类型的值,而无需执行任何额外的转换——简单地说,源值的位模式必须作为目标值有效。表述必须相同。否则,CLR需要有额外的信息才能在正确的时间执行正确的转换 埃里克·利珀特在博客中谈到了——更多信息请参见该帖子(一如既往:)。乔恩是对的;把它扩展一点。假设你有 Func<int> f1 = ()=>
埃里克·利珀特在博客中谈到了——更多信息请参见该帖子(一如既往:)。乔恩是对的;把它扩展一点。假设你有
Func<int> f1 = ()=>2;
Func<object> f2 = f1;
object o1 = f1();
object o2 = f2();
显然,存储在o2中的结果应该是一个装箱整数。装箱指令在哪里?它不能在对f2的调用之后,因为该对象已被保证返回一个对象。它不能出现在对f2的调用中,因为对f2的调用实际上是对f1的调用,而f1保证它返回一个未绑定的int
因此,装箱指令不能在调用返回之后发生,也不能在调用返回之前发生,因此它根本不可能发生,因此这肯定是非法的。没有从
Func
到Func
的引用转换 不,但他们可以实现接口。。。例如,您可以从IEnumerable
转换为IEnumerable
。。。但是你不能。@Jon:说得好。是的,它们可以实现接口,但这需要隐式装箱,而且它仍然不是继承。因此,返回整数的IEnumerable只能返回已装箱的整数,而不能隐式取消装箱。
object o1 = BoxIntegerToObject(f1());