为什么抛出InvalidCastException?有人可以形容我这种行为吗?
object zero = 0;
decimal? dec = (decimal?)zero;
答案 0 :(得分:15)
装箱int
只能取消装箱到int
。然而,这是合法的:
object zero = 0;
decimal? dec = (decimal?)(int)zero;
有关详细信息,请参阅MSDN或ECMA 334 C#规范。关键在于:
取消装箱是从类型对象到值类型或从接口类型到实现接口的值类型的显式转换。拆箱操作包括:
修改:此链接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;