更新:这个问题是我 2010 年 5 月 27 日博客的主题。谢谢你的好问题!
这里有很多非常令人困惑的答案。让我试着准确地回答你的问题。让我们简化一下:
object value = whatever;
bool condition = something;
decimal result = (decimal)(condition ? value : 0);
编译器如何解释最后一行?编译器面临的问题是两个分支的条件表达式类型必须一致;语言规则不允许您在一个分支上返回 object 而在另一个分支上返回 int。选择是 object 和 int。每个 int 都可以转换为 object,但不是每个 object 都可以转换为 int,因此编译器选择 object。因此这与
decimal result = (decimal)(condition ? (object)value : (object)0);
因此,返回的零是一个装箱的 int。
然后,您将 int 拆箱为十进制。将装箱的 int 拆箱为十进制是非法的。至于原因,请参阅我关于该主题的博客文章:
表示和身份
基本上,您的问题是您的行为就像分配了十进制转换,如下所示:
decimal result = condition ? (decimal)value : (decimal)0;
但正如我们所见,这不是
decimal result = (decimal)(condition ? value : 0);
方法。这意味着“将两种选择都放入对象中,然后将生成的对象拆箱”。