Cette question a fait l' objet de mon blog le 30 mai 2013 . Merci pour la bonne question!
Vous regardez une allée vide.
Quelqu'un vous demande "votre entrée peut-elle contenir une Honda Civic?"
Oui. Oui il peut.
Quelqu'un vous indique une deuxième allée. Il est également vide. Ils demandent "Le contenu actuel de mon entrée peut-il tenir dans votre entrée?"
Oui évidemment. Les deux allées sont vides! Il est donc clair que le contenu de l'un peut s'intégrer dans l'autre, car il n'y a pas de contenu de l'un ou l'autre en premier lieu.
Quelqu'un vous demande "Votre entrée contient-elle une Honda Civic?"
Non.
Vous pensez que l' is
opérateur répond à la deuxième question: étant donné cette valeur, s'inscrit-elle dans une variable de ce type? Une référence nulle tient-elle dans une variable de ce type? Oui.
Ce n'est pas la question à laquelle is
répond l' opérateur. La question à laquelle l' is
opérateur répond est la troisième question. y is X
ne demande pas " est y
une valeur légale d'une variable de type X
? " Il demande " Une y
référence valide à un objet de type X
? " Puisqu'une référence nulle n'est pas une référence valide à un objet de tout type, la réponse est "non ". Cette allée est vide; il ne contient pas de Honda Civic.
Une autre façon de voir les choses est que cela y is X
répond à la question "si je disais y as X
, est-ce que j'obtiendrai un résultat non nul? Si y est nul, la réponse est clairement non!
Pour approfondir votre question:
On s'attend à ce que la valeur nulle appartienne à n'importe quel type référence (ou nullable)
On supposerait implicitement qu'un type est un ensemble de valeurs , et que la compatibilité d'affectation d'une valeur y avec une variable de type X n'est ni plus ni moins que de vérifier si y est membre de l'ensemble x .
Bien que ce soit une façon extrêmement courante de regarder les types, ce n'est pas la seule façon de regarder les types, et ce n'est pas la façon dont C # regarde les types. Les références nulles sont des membres sans type en C #; la compatibilité d'affectation est pas simplement vérifier un ensemble pour voir si elle contient une valeur. Juste parce qu'une référence nulle est compatible avec l'affectation n'est pas avec une variable de type référence X que null est un membre de type X. La relation "est affectation compatible avec" et la relation "est membre de type" ont évidemment beaucoup de se chevauchent, mais ils ne sont pas identiques dans le CLR.
Si les réflexions sur la théorie des types vous intéressent, consultez mes articles récents sur le sujet:
Quelle est cette chose que vous appelez un «type»? Partie un
Quelle est cette chose que vous appelez un «type»? Deuxième partie