Mise à JOUR: Cette question a été l'objet de mon blog le 27 Mai 2010. Merci pour la grande question!
Il y a un grand nombre de très déroutant réponses ici. Permettez-moi d'essayer de répondre précisément à votre question. Nous allons simplifier ce bas:
object value = whatever;
bool condition = something;
decimal result = (decimal)(condition ? value : 0);
Comment le compilateur interpréter la dernière ligne? Le problème rencontré par le compilateur, c'est que le type de l'expression conditionnelle doit être uniforme pour les deux branches; les règles de la langue ne vous permettent pas de revenir sur l'objet d'une branche et d'un int sur les autres. Les choix sont l'objet et l'int. Tous les int est convertible à l'objet, mais pas tous l'objet est convertibles en un int, donc le compilateur choisit objet. Donc c'est le même que
decimal result = (decimal)(condition ? (object)value : (object)0);
Par conséquent, le zéro retourné est un coffret int.
Ensuite, vous unbox l'int à la décimale. Il est illégal de unbox un coffret int nombre décimal. Pour les raisons, voir mon article de blog sur le sujet:
La représentation et de l'Identité
Fondamentalement, votre problème est que vous agissez comme si le casting de décimales ont été distribués, comme ceci:
decimal result = condition ? (decimal)value : (decimal)0;
Mais comme nous l'avons vu, ce n'est pas ce
decimal result = (decimal)(condition ? value : 0);
les moyens. Que signifie "faire à la fois des solutions de rechange dans les objets, et puis unbox l'objet".