基本上,当CLR可以确保不需要对值进行任何 表示性更改 时,就会应用差异。引用看起来都一样-
因此您可以
IEnumerable<string>在
IEnumerable<object>不更改表示形式的情况下将其用作。本机代码本身根本不需要知道您正在使用这些值做什么,只要基础结构保证它肯定是有效的即可。
对于值类型,这是行不通的-将a
IEnumerable<int>视为
IEnumerable<object>,使用该序列的代码将必须知道是否执行装箱转换。
通常,您可能想阅读Eric Lippert
关于表示和身份的博客文章,以获取更多有关该主题的信息。
编辑:我自己重新阅读了Eric的博客文章,尽管两者是相互联系的,但至少与 身份 同样重要。特别是:
这就是为什么接口和委托类型的协变和协变转换要求所有不同类型的参数都是引用类型的原因。为了确保变体引用转换始终保留身份,所有涉及类型实参的转换也必须保留身份。确保类型参数上的所有非平凡转换都保留身份的最简单方法是将它们限制为引用转换。
欢迎分享,转载请注明来源:内存溢出
评论列表(0条)