Why can't I unbox an int as a decimal?

c#, decimal, int, unboxing

Solution

You can only unbox a value type to its original type (and the nullable version of that type).

By the way, this is valid (just a shorthand for your two line version):

object i = 4;
decimal d = (decimal)(int)i; // works even w/o decimal as it's a widening conversion

For the reason behind this read this Eric Lippert's blog entry: Representation and Identity

Personally, I categorize things done by cast syntax into four different types of operation (they all have different IL instructions):

- Boxing (`box` IL instruction) and unboxing (`unbox` IL instruction)

- Casting through the inhertiance hierarchy (like `dynamic_cast<Type>` in C++, uses `castclass` IL instruction to verify)

- Casting between primitive types (like `static_cast<Type>` in C++, there are plenty of IL instructions for different types of casts between primitive types)

- Calling user defined conversion operators (at the IL level they are just method calls to the appropriate `op_XXX` method).

Problem

I have an `IDataRecord reader` that I'm retrieving a decimal from as follows: ``` decimal d = (decimal)reader[0]; ``` For some reason this throws an invalid cast exception saying that the "Specified cast is not valid." When I do `reader[0].GetType()` it tells me that it is an Int32. As far as I know, this shouldn't be a problem.... I've tested this out by this snippet which works just fine. ``` int i = 3750; decimal d = (decimal)i; ``` This has left me scratching my head wondering why it is failing to unbox the int contained in the reader as a decimal. Does anyone know why this might be occurring? Is there something subtle I'm missing?

Original source

Related problems