Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/linux/23.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
.net 4.0 为什么.NET4中的variance只支持引用类型?_.net 4.0 - Fatal编程技术网

.net 4.0 为什么.NET4中的variance只支持引用类型?

.net 4.0 为什么.NET4中的variance只支持引用类型?,.net-4.0,.net 4.0,.NET4支持协方差和逆变。但是,仅支持引用类型,不支持值类型。这是为什么?这两种形式的差异都是根据继承定义的:值类型不是继承的。基本上,CLR需要知道,它可以将“源”类型的值视为“目标”类型的值,而无需执行任何额外的转换——简单地说,源值的位模式必须作为目标值有效。表述必须相同。否则,CLR需要有额外的信息才能在正确的时间执行正确的转换 埃里克·利珀特在博客中谈到了——更多信息请参见该帖子(一如既往:)。乔恩是对的;把它扩展一点。假设你有 Func<int> f1 = ()=>

.NET4支持协方差和逆变。但是,仅支持引用类型,不支持值类型。这是为什么?

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

基本上,CLR需要知道,它可以将“源”类型的值视为“目标”类型的值,而无需执行任何额外的转换——简单地说,源值的位模式必须作为目标值有效。表述必须相同。否则,CLR需要有额外的信息才能在正确的时间执行正确的转换


埃里克·利珀特在博客中谈到了——更多信息请参见该帖子(一如既往:)。

乔恩是对的;把它扩展一点。假设你有

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());