2016-06-07 2 views
6

Observation: Si le texte est null, cette méthode renvoie True. Je m'attendais à Faux.Lorsque le texte est nul, le texte? .IndexOf (ch)! = -1 est True?

return text?.IndexOf('A') != -1; 

Quand je pense la ligne ci-dessus à l'aide ILSpy (ou inspecter l'IL), c'est le code généré:

return text == null || text.IndexOf('A') != -1; 

Voici ce que je dois vraiment répondre à mes attentes:

return text != null && text.IndexOf('A') != -1; 

Question: Quelqu'un at-il une bonne explication sur la raison pour laquelle le code conditionnel nul a généré le OU expression?

Échantillon complet à: https://dotnetfiddle.net/T1iI1c

Répondre

7

La ligne ci-dessus implique vraiment deux opérations: une méthode opérateur nul appel conditionnel, et une comparaison. Que se passe-t-il si vous stockez le résultat du premier opérateur en tant que variable intermédiaire?

int? intermediate = text?.IndexOf('A'); 
return intermediate != -1; 

Il est clair que si text est nul alors intermediate sera également nulle. En comparant cela avec , toute valeur entière utilisant != renverra true.

From MSDN (Souligné par):

Lorsque vous effectuez des comparaisons avec les types nullable, si la valeur de l'un des types nullable est nul et l'autre n'est pas, toutes les comparaisons évaluer false sauf pour! = (non égal).

Ce code peut être écrit en utilisant l'opérateur nul conditionnelle aussi longtemps que vous pouvez utiliser un autre opérateur pour assurer une comparaison avec nulle évalue à false. Dans ce cas,

return text?.IndexOf('A') > -1; 

renverra la sortie attendue.

+1

Merci pour cette très bonne analyse et en particulier le bit MSDN. C'est une bonne leçon à apprendre sur la comparaison des types NULL. D'autres à mon travail ont été mordus par lui aussi. –