我了解什么是装箱。值类型被封装为对象/引用类型,然后作为对象存储在托管堆上。但我无法理解拆箱。
拆箱将您的对象/引用类型转换回值类型。
拆箱将您的对象/引用类型转换回值类型。
int i = 123; // A value type
object box = i; // Boxing
int j = (int)box; // Unboxing
好的。但是如果我试图将一个值类型拆箱成另一个值类型,例如上面的示例中的long,它会抛出InvalidCastException异常。
long d = (long)box;
我认为运行时隐式地知道了“box”对象内包装的值类型的实际类型。如果我是正确的,我想知道这个类型信息存储在哪里。
编辑:
由于int
可以隐式转换为long
,这让我感到困惑。
int i = 123;
long lng = i;
这是完全没涉及到装箱/拆箱的技术,所以很好。
Foo
实例(引用类型),然后将其分配给一个object
变量。如果你尝试将其转换为Bar
实例(也是引用类型),难道不也会期望出现相同的异常吗?正如 @JonathonReinhart 所说,装箱/拆箱并没有真正涉及到它。 - Daniel Kelley