为什么这个类型转换会导致错误

本文关键字:错误 类型转换 为什么 | 更新日期: 2023-09-27 18:12:44

按预期运行:

byte b = 7;
var i = (int)b;

抛出InvalidCastException:

byte b = 7;
object o = b;
var i = (int)o;

当底层类型仍然是byte时,为什么从object强制转换失败?

为什么这个类型转换会导致错误

因为byte显式地转换为int,而object没有。

如果你告诉编译器object实际上是 byte,那么它将再次允许你显式地转换为int

byte b = 7;
object o = b;
var i = (int)((byte)o);

引用:

类型转换和类型转换
字节

这是由clr使用装箱和拆箱引起的。当你把一个值类型当作一个对象时,CLR会自动为你把这个值类型框在一个对象中。然而,CLR只支持按MSDN将盒装对象拆成其原始值类型:

<

拆箱/strong>

拆箱是从类型对象到值的显式转换类型或从接口类型转换为实现的值类型接口。拆箱操作包括:

  • 检查对象实例以确保它是给定值类型的盒装值

  • 将实例中的值复制到值类型变量中

object o = b;导致CLR创建一个盒装字节并将其作为对象存储在0中。然后var i = (int)o;尝试将盒装字节解盒为int型。这将导致异常,因为装箱类型(byte)和值类型(int)不同。

转换为整数之前,必须首先从对象中获取字节。

像这样:

var i = (int)(byte)o;