【发布时间】:2014-07-30 11:11:31
【问题描述】:
我明白什么是拳击。值类型被装箱为对象/引用类型,然后作为对象存储在托管堆上。但我无法通过拆箱。
拆箱会将您的对象/引用类型转换回值类型
int i = 123; // A value type
object box = i; // Boxing
int j = (int)box; // Unboxing
好的。但是如果我尝试将一个值类型拆箱成另一个值类型,例如,在上面的例子中,它会抛出 InvalidCastException
long d = (long)box;
它给我留下了一个想法,可能是运行时隐式知道装在“box”对象内的值类型的实际类型。如果我是对的,我想知道这个类型信息存储在哪里。
编辑:
因为int 可以隐式转换为long。这让我很困惑。
int i = 123;
long lng = i;
非常好,因为它不涉及装箱/拆箱。
【问题讨论】:
-
box.GetType() 怎么样?
-
运行时知道每个对象的类型。装箱的值也不例外。
-
假设你有一个值类型的
Ball,你在GlassBox中放了一个球。这会阻止你知道它是玻璃盒子里的一个球吗?你可以清楚地看到不是吗?就这样.. -
这是一个有点令人困惑的问题。假设您创建了一个
Foo实例(引用类型),然后将其分配给object变量。如果您尝试将其强制转换为Bar实例(也是引用类型),您是否也不会期待同样的异常?正如@JonathonReinhart 所说,装箱/拆箱并没有真正涉及。 -
@DanielKelley,我承认我没有提到我的困惑,即当装箱/拆箱发挥作用时,即使从隐式可转换类型转换也不起作用。查看我的编辑。