2010-05-04 5 views
36

Le code C# ci-dessous:Pourquoi est-ce que je ne peux pas définir un int nullable à null dans une instruction if ternaire?

int? i; 
i = (true ? null : 0); 

me donne l'erreur:

Type of conditional expression cannot be determined because there is no implicit conversion between '<null>' and 'int'

Si pas valable? Qu'est-ce que j'oublie ici?

+2

Ceci est un doublon de http://stackoverflow.com/questions/2450866 qui était à son tour un duplicata de http://stackoverflow.com/questions/858080. Voir http://stackoverflow.com/questions/2215745/conditional-operator-cannot-cast-implicitly/2215959#2215959 pour une analyse du problème. –

Répondre

81

Le compilateur essaie d'évaluer l'expression de droite. null est null et le 0 est un littéral int, pas int?. Le compilateur essaie de vous dire qu'il ne peut pas déterminer quel type l'expression devrait évaluer. Il n'y a pas de conversion implicite entre null et int, d'où le message d'erreur. Vous devez indiquer au compilateur que l'expression doit être évaluée comme int?. Il y a une conversion implicite entre int? et int, ou entre null et int?, non plus de ceux-ci devraient fonctionner:

int? x = true ? (int?)null : 0; 

int? y = true ? null : (int?)0; 
1

La partie (true ? null : 0) devient une fonction d'une manière. Cette fonction nécessite un type de retour. Lorsque le compilateur a besoin de comprendre le type de retour, il ne peut pas.

Cela fonctionne:

int? i; 
i = (true ? null : (int?)0); 
13

Vous devez utiliser le mot-clé par défaut () plutôt que nulle lorsqu'ils traitent avec des opérateurs ternaires.

Exemple:

int? i = (true ? default(int?) : 0); 

Alternativement, vous pouvez simplement lancer le null:

int? i = (true ? (int?)null : 0); 

Personnellement, je bâton avec la notation default(), il est juste une préférence, vraiment. Mais vous devriez coller à une seule notation spécifique, à mon humble avis.

HTH!

Questions connexes