30 votes

En C #, pourquoi un opérateur conditionnel ne peut-il pas implicitement être converti en type nullable

Je suis curieux de savoir pourquoi une distribution implicite échoue dans ...

 int? someValue = SomeCondition ? ResultOfSomeCalc() : null;
 

et pourquoi je dois effectuer un casting explicite à la place

 int? someValue = SomeCondition ? ResultofSomeCalc() : (int?)null;
 

Il me semble que le compilateur a toutes les informations dont il a besoin pour prendre une décision de casting implicite, non?

27voto

Brian Liang Points 4375

La section pertinente du C# 3.0 est 7.13, l'opérateur conditionnel:

La deuxième et la troisième des opérandes de l' ?: l'opérateur de contrôler le type de l'expression conditionnelle. Soit X et Y des types de la deuxième et de la troisième opérande. Ensuite,

Si X et Y sont du même type, puis c'est le type de la condition Sinon, si une conversion implicite (§6.1) existe à partir de X à Y, mais pas à partir de Y à X, alors Y est le type de l'expression conditionnelle. Sinon, si une conversion implicite (§6.1) existe à partir de Y à X, mais pas de X à Y, alors X est le type de l'expression conditionnelle. Sinon, pas de type d'expression peut être déterminé, et une erreur de compilation se produit.

15voto

TheSoftwareJedi Points 15921

Moi aussi je suis agacé qu'il ne peut pas déduire le type basé sur la tâche, surtout quand c'est un type valeur. Il y a des raisons, mais quand vous obtenez en un objet hiérarchies.

Si "ResultOfSomeCalc()" retourné "int?", puis ce serait le travail. C# doit déterminer le type indépendamment de ce qui est à gauche de l'affectation. Donc, vous dites que vous allez retourner une valeur null ou un int et de la logique dans le compilateur n'existe pas de l'avoir remplacer par un Nullable comme un dénominateur commun.

Notez que ces variantes de FAIRE le travail, et il peut vous aider à comprendre:

object someValue = true ? new Nullable<int>(ResultOfSomeCalc()) : null;

object someValue = true ? (int?)ResultOfSomeCalc() : null;

Espérons que cette aide.

5voto

Mr. Putty Points 1101

Il semble que c'est quelque chose que le compilateur devrait être capable de comprendre par lui-même, mais il existe une autre façon de le faire, en utilisant le mot-clé par défaut. Ce pourrait être le plus petit peu moins laid que le casting:

 int? someValue = SomeCondition ? ResultofSomeCalc() : default(int?);
 

Cette utilisation de la valeur par défaut ne semble pas bien documentée, mais elle fonctionne. Au moins, cela vous évite d'avoir à encombrer votre code de valeurs magiques (je soutiens que null / zero / false / etc. Sont en effet des valeurs magiques).

4voto

harpo Points 17399

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X