gpt4 book ai didi

c# - 泛型仅支持引用转换,不支持装箱转换

转载 作者:行者123 更新时间:2023-12-01 22:37:36 24 4
gpt4 key购买 nike

在阅读第 91 页关于装箱和拆箱的c# 简而言之时,作者写道:

Boxing conversions are crucial in providing a,unified type system. The system is not perfect, however we will see in Generics that variance with arrays and generics supports only **reference conversions ** and not **boxing conversions **

并引用示例代码:

object [] a1 = new string [3]; //legal
object [] a2 = new int [3]; // error

有人可以解释一下作者想要表达什么以及为什么第一行是合法的而第二行是不合法的?

最佳答案

嗯,string 之间有一个引用转换object ,因为每个字符串引用都可以被视为对象引用。这可以透明地完成,根本不需要修改该值。这就是为什么数组方差可以很便宜地完成——无论如何,对于读取来说。读取object[]值(在编译时已知)恰好确实string[]在执行时基本上是免费的 - 您读取该值,并且可以将其视为 object引用。写作更痛苦——每次写object[]必须检查您正在写入的值是否与您尝试存储它的数组真正兼容。

这里重要的是 string表示引用与 object 的表示相同引用。

int 之间存在拳击转换object这可以让这个工作:

int x = 10;
object y = x;

...但是这种转换涉及更多的操作; CLR 必须创建一个包含相关整数的对象。 int 的表示与 object 的表示相同引用。从数组中读取数据时,检查是否有必要(并随心所欲地执行)会相对痛苦(从性能角度来看),因此处理 int[]无效。作为object[] .

通用方差也是如此。这很好:

List<string> strings = new List<string>();
IEnumerable<object> objects = strings; // IEnumerable<T> is covariant in T

但这不是:

List<int> ints = new List<int>();
IEnumerable<object> objects = ints; // Covariance doesn't apply here

有关代表和身份的更多信息,请参阅 Eric Lippert's blog post on the topic 。 (它并没有太多谈论方差,但它们都是相关的......)

关于c# - 泛型仅支持引用转换,不支持装箱转换,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/30059279/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com