[英]How does the CLR know the type of a boxed object?
当值类型被装箱时,它被放置在无类型的引用对象内。 那么是什么导致无效的强制转换异常?
long l = 1;
object obj = (object)l;
double d = (double)obj;
不,它不是放在一个无类型的对象中。 对于每种值类型,CLR中都有一个盒装引用类型。 所以你有类似的东西 :
public class BoxedInt32 // Not the actual name
{
private readonly int value;
public BoxedInt32(int value)
{
this.value = value;
}
}
虽然它是在C ++ / CLI中,但在C#中无法直接访问该盒装类型。 显然知道原始类型。 所以在C#中你必须有一个编译时类型的变量object
,但这并不意味着它是对象的实际类型。
有关更多详细信息,请参阅ECMA CLI规范或CLR通过C# 。
Jon Skeet的答案涵盖了原因; 至于如何绕过它,这是你必须做的:
long l = 1;
object obj = (object)l;
double d = (double)(long)obj;
双重演员的原因是这样的; 当.NET取消变量变量时,它只知道如何将它打包成它所装箱的类型(在你的例子中long
)。一旦你取消装箱它并且你有一个合适的long
原语,你可以将它转换成double
或者任何其他类型的铸造从long
。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.