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,这正好回答了我的疑问。