尝试将装箱后的int转换为byte

7

代码示例:

        int i = 5;
        object obj = i;
        byte b = (byte)obj; // X

运行时,这会在"X"行生成一个"System.InvalidCastException"("指定的转换无效")错误。进行双重转换可以解决:

        byte b = (byte)(int)obj;

我认为你应该能够将一个装箱的int(如果它在0.. 255范围内有值)转换为byte。有人可以解释一下吗? (这是在.NET 2.0中,如果有影响的话)。
2个回答

19
你看到的行为差异是 标识和表示 之间的差异。
拆箱是一种 标识 转换,也是一种 保留表示 的操作。然而,将一个 int 强制转换为 byte 是一种 改变表示 的操作(因为可能会丢失精度)。
当你尝试将 int 作为 byte 进行拆箱时,会得到一个 InvalidCastException,因为装箱值的 标识 不是 byte,而是 int。当你写下 byte b = (byte)obj 时,你告诉运行时,我知道里面的内容一个 byte,但你真正想表达的是,我认为里面的内容可以被转换成一个 byte
为了做出后者的陈述,你首先必须声明对象的 标识,即 int。只有这样,才能进行表示改变的转换为 byte
请注意,即使目标类型是“较大”的类型,例如Int64,这也适用。所有显式转换中,如果目标类型不在源类型的继承树中,则被视为更改表示形式。由于所有类型都派生自System.Object,因此按定义解包不能更改表示形式。

5

MSDN明确指出,将一个变量拆箱成不同类型会抛出InvalidCastException异常。

我的理解是,变量拆箱的类型实际上是底层CIL汇编命令的参数。实际上是unbox操作码引起了InvalidCastException异常。

如果对象未装箱为valType,则会抛出InvalidCastException异常。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接