首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >为什么.NET 4中的variance只支持引用类型?

为什么.NET 4中的variance只支持引用类型?
EN

Stack Overflow用户
提问于 2010-06-17 04:21:12
回答 3查看 160关注 0票数 2

.NET 4支持协变和逆变。但是,只支持引用类型,不支持值类型。为什么会这样呢?

EN

回答 3

Stack Overflow用户

发布于 2010-06-17 04:26:24

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

Eric Lippert写了一篇关于representation and identity的博客--更多信息请看这篇文章(一如既往:)。

票数 7
EN

Stack Overflow用户

发布于 2010-06-17 17:42:00

Jon是对的;只是在这一点上稍作扩展。假设你有

代码语言:javascript
复制
Func<int> f1 = ()=>2;
Func<object> f2 = f1;
object o1 = f1();
object o2 = f2();

假设这是合法的。编译器生成装箱指令;第三行实际上是:

代码语言:javascript
复制
object o1 = BoxIntegerToObject(f1());

显然,存储在o2中的结果应该是一个装箱的整数。拳击指南在哪里?它不能在调用f2之后,因为那个东西肯定已经返回了一个对象。它不能出现在对f2的调用中,因为对f2的调用实际上是对f1的调用,而f1保证返回一个未装箱的整数。

所以装箱指令不能在调用返回之后发生,也不能在调用返回之前发生,因此根本不可能发生,因此这肯定是非法的。不存在从Func<int>Func<object>的引用转换。

票数 3
EN

Stack Overflow用户

发布于 2010-06-17 04:25:54

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

票数 2
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/3056888

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档