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

Prz*_*aas 4 .net c#

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

object zero = 0;
decimal? dec = (decimal?)zero;
Run Code Online (Sandbox Code Playgroud)

jas*_*son 15

盒装int只能打开一个盒子int.但是,这是合法的:

object zero = 0;
decimal? dec = (decimal?)(int)zero;
Run Code Online (Sandbox Code Playgroud)

有关详细信息,请参阅MSDN或ECMA 334 C#规范.这里的关键是以下内容:

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

  1. 检查对象实例以确保它是给定值类型的盒装值.
  2. 将实例中的值复制到value-type变量中.

编辑:这篇链接的文章值得退出评论.谢谢Rob Kennedy!

  • Eric Lippert详细介绍了为什么它的工作原理.摘要:除了原始类型之外的任何内容的拆箱将涉及*大量*生成的代码用于所有不同的可能性,因为编译器不知道原始的盒装类型是什么.http://blogs.msdn.com/ericlippert/archive/2009/03/19/representation-and-identity.aspx (3认同)