试图将boxed int转换为byte
代码说明:
int i = 5; object obj = i; byte b = (byte)obj; // X
运行时,会在“X”行生成System.InvalidCastException(“指定的强制转换无效”)。 做双重演奏:
byte b = (byte)(int)obj;
我本以为你应该能够将一个盒装的int(如果它的值在0..255范围内)转换成一个字节。 任何人都可以对此有所了解吗?
(这在.net 2.0中,如果重要的话)。
您所看到的行为差异是身份和表现之间的差异。
拆箱是一种标识转换和一种表示保留操作。 但是,将int
转换为byte
是表示更改 (因为可能会丢失精度)。
当您尝试将int
作为一个byte
取消打包时,您会收到InvalidCastException
,因为盒装值的标识不是一个byte
,而是一个int
。 当你写byte b = (byte)obj
,你告诉运行时, 我知道那里有一个byte
,但你真正想说的是, 我认为那里的东西可以转换成一个byte
。
为了生成后一个语句,首先必须声明对象的标识 ,这是一个int
。 然后,只有这样才能将表示转换为byte
。
请注意,即使目标类型为“较大”(即Int64
,这也适用。 目标类型不在源类型的inheritance树中的所有显式转换都被视为表示更改。 由于所有类型都派生自System.Object
,因此按定义拆箱不能更改表示。
MSDN明确表示对另一种类型进行拆箱会抛出InvalidCastException
。
我的理解是,取消装箱变量的类型实际上是底层CILassembly命令的参数。 它是unbox
操作码实际上抛出InvalidCastException
。
如果对象未设置为valType,则抛出InvalidCastException。