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

C# 为什么这个类型转换会导致错误?,c#,.net,casting,C#,.net,Casting,这与预期的效果一样: byte b = 7; var i = (int)b; 这会引发一个InvalidCastException: byte b = 7; object o = b; var i = (int)o; 当基础类型仍然是字节时,为什么从对象强制转换失败?因为字节有一个到int的显式转换,而对象没有 如果您告诉编译器对象实际上是一个字节,那么它将再次允许您显式转换为int byte b = 7; object o = b; var i = (int)((byte)o); 参考资

这与预期的效果一样:

byte b = 7;
var i = (int)b;
这会引发一个
InvalidCastException

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

当基础类型仍然是
字节时,为什么从
对象
强制转换失败?

因为
字节
有一个到
int
的显式转换,而
对象
没有

如果您告诉编译器
对象
实际上是一个
字节
,那么它将再次允许您显式转换为
int

byte b = 7;
object o = b;
var i = (int)((byte)o);
参考资料:



必须先从对象中获取字节,然后才能将其转换为整数

大概是这样的:

var i = (int)(byte)o;

这是由的CLRs使用引起的。当您将值类型视为对象时,CLR将自动在对象内为您装箱该值类型。但是,CLR仅支持按照以下方式将装箱对象解装箱为其原始值类型:

拆箱

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

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

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


对象o=b使CLR创建一个装箱字节,并将其作为对象存储在o中<代码>变量i=(int)o
然后尝试将装箱字节取消装箱为int。这会导致异常,因为装箱类型(byte)和值类型(int)不同

啊,我只是想回答这个问题:p这个问题探讨了这个问题:——特别是埃里克·利珀特的回答很好。@MattGreer,这正好回答了我的疑问。