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

6

这个按预期工作:

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

当这个代码抛出 InvalidCastException 异常时:

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

为什么在底层类型仍为byte的情况下,从object强制转换失败?

3
这个问题探讨了这个链接中的内容:https://dev59.com/ym035IYBdhLWcg3wKsqa。尤其是Eric Lippert的回答很有价值。 - Matt Greer
@MattGreer 那确切地回答了我的疑问。 - Jeremy Elbourn
3个回答

6
因为byte类型可以显式转换为int类型,但object类型不行。
如果你告诉编译器这个object实际上是一个byte类型,那么它将再次允许你对其进行显式的int类型转换。
byte b = 7;
object o = b;
var i = (int)((byte)o);

参考文献:

类型转换与强制转换
byte数据类型


啊,我只是想回答一下 :P - Rob

1
这是由于CLR使用装箱和拆箱所导致的。每当您将值类型视为对象时,CLR会自动将此值类型装箱到Object中。然而,CLR仅支持将装箱的对象拆箱为其原始值类型,如MSDN所述:

拆箱

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

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

  • 将值从实例复制到值类型变量。

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


0

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

可以尝试以下代码:

var i = (int)(byte)o;

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