当值类型被装箱时,它被放置在无类型引用对象中。 那么是什么导致了无效的强制转换异常?
long l = 1;
object obj = (object)l;
double d = (double)obj;
答案 0 :(得分:17)
不,它不是放在一个无类型的对象中。对于每种值类型,CLR中都有一个盒装引用类型。所以你有之类的东西:
public class BoxedInt32 // Not the actual name
{
private readonly int value;
public BoxedInt32(int value)
{
this.value = value;
}
}
在C#中无法直接访问该盒装类型,尽管它位于C ++ / CLI中。显然知道原始类型。所以在C#中,你必须为变量设置编译时类型object
,但这并不意味着它是对象的实际类型。
有关详细信息,请参阅ECMA CLI spec或CLR via C#。
答案 1 :(得分:9)
答案 2 :(得分:6)
long l = 1;
object obj = (object)l;
double d = (double)(long)obj;
双重演员的原因是这样的;当.NET取消对变量进行解包时,它只知道如何将其拆分为它所装箱的类型(在您的示例中为long
。)一旦取消装箱并且您有一个正确的long
原语,然后,您可以将其转换为double
或来自long
的任何其他类型的可投射。