When a value type is boxed, it is placed inside an untyped reference object. So what causes the invalid cast exception here?
long l = 1;
object obj = (object)l;
double d = (double)obj;
When a value type is boxed, it is placed inside an untyped reference object. So what causes the invalid cast exception here?
long l = 1;
object obj = (object)l;
double d = (double)obj;
Jon Skeet's answer covers the why; as for the how to get around it, here's what you have to do:
The reason for the dual cast is this; when .NET unboxes the variable, it only knows how to unbox it into the type it was boxed from (
long
in your example.) Once you've unboxed it and you have a properlong
primitive, you can then cast it todouble
or any other type castable fromlong
.No, it's not placed in an untyped object. For each value type, there's a boxed reference type in the CLR. So you'd have something like:
That boxed type isn't directly accessible in C#, although it is in C++/CLI. Obviously that knows the original type. So in C# you have to have a compile-time type of
object
for the variable but that doesn't mean that's the actual type of the object.See the ECMA CLI spec or CLR via C# for more details.
I answer your question here:
http://blogs.msdn.com/ericlippert/archive/2009/03/19/representation-and-identity.aspx