【问题标题】:Trying to cast a boxed int to byte试图将装箱的 int 转换为字节
【发布时间】:2011-02-27 14:19:00
【问题描述】:

代码说明:

        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 中,以防万一)。

【问题讨论】:

    标签: c# .net casting c#-2.0


    【解决方案1】:

    您看到的行为差异是identity and representation 之间的差异。

    拆箱是一个 identity 强制转换和一个 representation-preserving 操作。然而,将int 转换为byte改变表示形式(因为可能会损失精度)。

    当您尝试将int 拆箱为byte 时,您会得到InvalidCastException,因为装箱值的身份 不是byte,而是int .当你写 byte b = (byte)obj 时,你是在告诉运行时,我知道里面有什么 byte,但你真正想说的是,我认为里面的内容可以转换byte

    为了做出后一种说法,您首先必须声明对象的身份,即int。只有这样,您才能将表示更改转换为byte

    请注意,即使目标类型“更大”(即Int64),这也适用。 所有目标类型不在源类型的继承树中的显式转换都被认为是表示改变的。而且由于所有类型都派生自 System.Object,根据定义拆箱不能更改表示。

    【讨论】:

      【解决方案2】:

      MSDN explicitly says 拆箱到不同的类型会抛出一个InvalidCastException

      我的理解是变量拆箱的类型实际上是underlying CIL assembly command的参数。实际上抛出InvalidCastException的是unbox操作码。

      InvalidCastException 如果 对象未装箱为 valType。

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2016-03-04
        • 2016-02-20
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多