c# - 尝试将装箱的 int 转换为 byte

标签 c# .net casting c#-2.0

代码说明:

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

运行时,这会在“X”行生成一个 System.InvalidCastException(“指定的转换无效”)。做双重 Actor 作品:

        byte b = (byte)(int)obj;

我本以为您应该能够将装箱的 int(如果它的值在 0..255 范围内)转换为字节。任何人都可以阐明这一点吗?

(这是在 .net 2.0 中,以防万一)。

最佳答案

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

拆箱是一种身份转换,也是一种保留表示的操作。然而,将 int 转换为 byte改变表示(因为存在潜在的精度损失)。

当您尝试将 int 拆箱为 byte 时,您会得到一个 InvalidCastException,因为 identity装箱值不是 byte,它是 int。当你写 byte b = (byte)obj 时,你是在告诉运行时,我知道里面有什么一个byte ,但您真正想说的是,我认为可以将其中的内容转换字节。 p>

为了进行后一种声明,您首先必须声明对象的身份,它是一个int。然后,也只有到那时,您才能对 byte 进行表示更改转换。

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

关于c# - 尝试将装箱的 int 转换为 byte,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/2970967/

相关文章:

c# - 如何将PictureBox中JPG的部分白化为透明

c# - 使用存储库模式 MVC 5 和 EF 6 的工作单元

c# - 如何在 ASP 标签内编写 C# 代码

c# - 获取 - System.InvalidOperationException - 客户端投影包含对常量表达式的引用

c# - 为什么在 C# 中不包括从 T 到 T[] 的隐式转换?

c# - 继承 Linq to SQL 类并转换 linq 查询的结果

c# - StaticResource 标记扩展与 System.Windows.Application.FindResource

.net - WPF 3.5 中不一致的抗锯齿

c++ - 如何使用Arduino Serial.println使用 float 打印字符串

java - 多类型自定义数组列表