133 votes

Pourquoi est l’opérateur return false lorsqu’il est administré n’est null ?

Il me semble que l' is - opérateur est un peu incohérent.

bool Test()
{
    // Returns false, but should return true.
    return null is string;
}

On s'attend à ce que l' null de la valeur appartient à l'une de référence (ou nullable) de type. Et en effet, la spécification du langage C# dit quelque chose qui appuie cette hypothèse, par exemple (6.1.6 référence Implicite des conversions):

La référence implicite conversions sont:
...
• De la valeur null littérale de toute référence-type.

La description (7.10.10 L'opérateur is) de l' is de l'opérateur commence par dire que l'expression (E is T) entraînera dans le vrai lorsqu'une référence de conversion de E de T existe, mais ensuite, les auteurs vont sur en excluant explicitement le cas lors de l' E est le null littéral ou a un null de la valeur.

Pourquoi font-ils cela? Pour moi, il semble contre-intuitif.

195voto

Eric Lippert Points 300275

Cette question a fait l' objet de mon blog sur 30 Mai 2013. Merci pour la grande question!


Vous vous retrouvez face à un vide de l'allée.

Quelqu'un vous demande "votre allée tenir une Honda Civic?"

Oui. Oui, il peut.

Quelqu'un points vous à une deuxième entrée. Il est également vide. Ils demandent "le contenu actuel de mon allée se loger dans votre allée?"

Oui, évidemment. Les deux allées sont vides! Donc clairement le contenu de l'un peut s'adapter à l'autre, car il n'y a aucun contenu dans la première place.

Quelqu'un vous demande "est-ce que votre allée contenir une Honda Civic?"

Non, il n'est pas.

Vous êtes en train de penser que l' is de l'opérateur répond à la deuxième question: compte tenu de cette valeur, ne s'inscrit-elle dans une variable de ce type? N'référence null s'insérer dans une variable de ce type? Oui, c'est fait.

Ce n'est pas la question que l' is opérateur de réponses. La question que l' is opérateur de réponses à la troisième question. y is X ne le demande pas "est - y d'une valeur juridique d'une variable de type X?" Il demande "Est - y valide référence à un objet de type X?" Depuis une référence null n'est pas une référence valide pour tout objet de tout type, la réponse est "non". Cette allée est vide; il ne contient pas une Honda Civic.

Une autre façon de voir les choses, c'est que y is X réponses à la question "si je disais y as X, aurais-je obtenir une valeur non null? Si y est nul, clairement la réponse est non!


À regarder d'un peu plus profond à votre question:

On s'attend à ce que la valeur null n'appartient à aucun de référence (ou nullable) type de

On serait en supposant implicitement qu'un type est un ensemble de valeurs, et que la compatibilité d'affectation d'une valeur de y avec une variable de type X est rien de plus ni moins que de vérifier si y est un membre de l'ensemble x.

Si c'est un moyen extrêmement commun de recherche à des types, qui n'est pas la seule façon de voir les types, et ce n'est pas la façon dont C# regarde types. Null références sont membres d'aucun type en C#; compatibilité d'affectation est pas simplement de la vérification un ensemble pour voir si elle contient une valeur. Tout simplement parce que d'une référence null est d'affectation compatible avec une variable de type référence X ne signifie pas que la valeur null est un membre de type X. "est d'affectation compatible avec la" relation "est un membre de type" relation à l'évidence beaucoup de chevauchement, mais ils ne sont pas identiques dans le CLR.

Si les réflexions sur le type, la théorie de l'intérêt que vous, découvrez mes derniers articles sur le sujet:

Quelle est cette chose que vous appelez un "type"? La première partie

Quelle est cette chose que vous appelez un "type"? Partie Deux

24voto

Oded Points 271275

L' null littéral peut être attribué à tout type de référence. C'est pas un type dans une de lui-même. C'est un littéral qui représente une référence nulle.

Dans le cas d' is reviendrait true lorsque null serait passé, que seriez-vous capable de faire avec l' null littérale? Rien - c'est - null. Quel serait le point de revenir true sauf pour la confusion des questions?


De toute façon, en termes de la façon dont intuitive qui est, de lire le code en anglais et me dire:

null is string;

Quand je vois que, il semble être en posant la question, is "nothing" a string?. Mon intuition me dit que non, il n'est pas - il nothing.

24voto

manojlds Points 96599

Je pense que null is string renvoyer faux est très intuitif. Null ne signifie rien et ce n'est certainement pas une chaîne. Donc, il devrait retourner faux. Bien que les concepteurs de langage aient choisi ces options, il s’agit d’un choix très intuitif lorsque l’on considère le sens réel de null.

12voto

Miserable Variable Points 17515

http://msdn.microsoft.com/en-us/library/scekt9xw%28v=vs.71%29.aspx

Une expression est évaluée à true si les deux conditions suivantes sont remplies:

  • l'expression n'est pas nulle.
  • l'expression peut être converti en type. C'est un moulage de l'expression de la de forme (expression) complète sans la levée d'une exception. Pour plus d'informations, voir 7.6.6 Fonte d'expressions.

8voto

AakashM Points 32891

l' null de la valeur

J'ai cité ce à partir de votre question, car il semble pour obtenir le coeur de la question. null n'est pas une valeur, c'est l'absence de valeur. Le but de l' is me semble être de répondre à la question:

Si je jette E de T, vais-je réussir à obtenir un T ?

Maintenant, alors que vous pouvez exprimés null de T sans erreur, après avoir fait de sorte que vous n'avez pas "avoir un T" - vous avez encore rien. Il n'est donc pas le cas que null "est" un T, alors is renvoie la valeur false.

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