更新: この質問は、2010 年 5 月 27 日の私のブログの主題でした。素晴らしい質問をありがとう!
ここには非常に多くの非常に紛らわしい答えがあります。あなたの質問に正確に答えるようにしましょう。これを単純化しましょう:
object value = whatever;
bool condition = something;
decimal result = (decimal)(condition ? value : 0);
コンパイラは最後の行をどのように解釈しますか? コンパイラが直面する問題は、条件式の型が両方の分岐で一貫していなければならないということです。言語規則では、一方のブランチで object を返し、もう一方のブランチで int を返すことは許可されていません。選択肢は object と int です。すべての int はオブジェクトに変換できますが、すべてのオブジェクトが int に変換できるわけではないため、コンパイラはオブジェクトを選択します。したがって、これは
decimal result = (decimal)(condition ? (object)value : (object)0);
したがって、返されるゼロはボックス化された int です。
次に、int を 10 進数にボックス化解除します。ボックス化された int を 10 進数にアンボックスすることは違法です。その理由については、そのテーマに関する私のブログ記事を参照してください。
表象とアイデンティティ
基本的に、あなたの問題は、次のように、10 進数へのキャストが分散されているかのように振る舞っていることです。
decimal result = condition ? (decimal)value : (decimal)0;
しかし、これまで見てきたように、そうではありません
decimal result = (decimal)(condition ? value : 0);
意味。これは、「両方の選択肢をオブジェクトにしてから、結果のオブジェクトをアンボックスする」ことを意味します。