为什么我不能将盒装int转换为可以为空的十进制?

时间:2009-07-09 13:36:12

标签: c# .net

为什么抛出InvalidCastException?有人可以形容我这种行为吗?

object zero = 0;
decimal? dec = (decimal?)zero;

2 个答案:

答案 0 :(得分:15)

装箱int只能取消装箱到int。然而,这是合法的:

object zero = 0;
decimal? dec = (decimal?)(int)zero;

有关详细信息,请参阅MSDN或ECMA 334 C#规范。关键在于:

取消装箱是从类型对象到值类型或从接口类型到实现接口的值类型的显式转换。拆箱操作包括:

  1. 检查对象实例以确保它是给定值类型的装箱值。
  2. 将实例中的值复制到value-type变量中。
  3. 修改:此链接article值得退出评论。谢谢Rob Kennedy!

答案 1 :(得分:0)

请参阅此文章 http://msdn.microsoft.com/en-us/magazine/cc301569.aspx

具体地 “公共语言运行库首先确保引用类型变量不为null,并且它引用的对象是所需值类型的盒装值。如果任一测试失败,则会生成InvalidCastException异常。”

我认为你失败了这个价值的对象。我认为对int的转换是有效的,因为0 literal将转换为int,然后int转换为decimal。

如果你这样做就行了

    decimal? test=0;
    object zero = test;
    decimal? dec = (decimal?)zero;

但我认为你的代码片段中的“0”不是“十进制”类型。

我仍然不肯定,因为这会得到同样的例外。

        int test=0;
        object zero = test;
        decimal? dec = (decimal?)zero;