259 votes

Les types nullables et l’opérateur ternaire : Pourquoi est ' ? 10 : null' interdit ?

Je viens de tomber sur une erreur bizarre:

private bool GetBoolValue()
{
    //Do some logic and return true or false
}

Puis, dans une autre méthode, quelque chose comme ceci:

int? x = GetBoolValue() ? 10 : null;

Simple, si la méthode retourne true, affecter 10 pour la Nullableint x. Sinon, affecter la valeur null à la nullable int. Cependant, le compilateur se plaint:

Erreur de Type 1, de l'expression conditionnelle ne peut pas être déterminé, car il n'y a pas de conversion implicite entre int et <null>.

Vais-je fou?

430voto

LukeH Points 110965

Le compilateur essaie d'abord d'évaluer la partie droite de l'expression:

GetBoolValue() ? 10 : null

L' 10 est int littéral (pas int?) et null ,, null. Il n'y a pas de conversion implicite entre ces deux d'où le message d'erreur.

Si vous modifiez la partie droite de l'expression de l'une des opérations suivantes, puis il compile car il y a une conversion implicite entre int? et null (#1) et entre int et int? (#2).

GetBoolValue() ? (int?)10 : null    // #1
GetBoolValue() ? 10 : (int?)null    // #2

36voto

Andrew Hare Points 159332

Essayez ceci:

int? x = GetBoolValue() ? 10 : (int?)null;

Fondamentalement, ce qui se passe est que l'opérateur conditionnel est pas en mesure de déterminer le "type de retour" de l'expression. Puisque le compilateur implictitly décide qu' 10 est int il décide alors que le type de retour de cette expression doit être un int . Depuis un int ne peut pas être null (le troisième opérande de l'opérateur conditionnel), il se plaint.

Par la coulée de l' null d'un Nullable<int> nous disent que le compilateur explicitement que le type de retour de cette expression doit être un Nullable<int>. Vous pourriez avoir aussi facilement coulé l' 10 de int? ainsi et a le même effet.

15voto

Unknown Points 350

Essayez ceci :

``

15voto

Eric Lippert Points 300275

Soit dit en passant, l’implémentation Microsoft du compilateur c# effectivement obtient le type d’analyse de l’opérateur conditionnel mal dans un très subtil et intéressant (pour moi) moyen. Mon article à ce sujet est malheurs d’inférence de Type, partie 1.

5voto

John Gietzen Points 23645

Essayez l’un de ceux-ci :

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