2016-11-11 4 views
5

J'ai la ligne de code suivante: sur le côté gauchePourquoi l'opérateur conditionnel nul peut-il être utilisé lors de la définition de la valeur d'un booléen sans utiliser un bool validé?

user.Exists = await this.repository?.Exists(id); 

Exists est une propriété de la classe User. Son type est juste bool, pas bool?. La méthode Exists sur le côté droit est une méthode API pour vérifier si une entité donnée existe dans le référentiel. Il renvoie Task<bool>. Je veux vérifier si le référentiel est null en premier donc j'utilise l'opérateur conditionnel nul. Je pensais que si le référentiel était nul alors tout le côté droit retournerait simplement null, ce qui ne peut pas être assigné à un type bool, mais le compilateur semble bien fonctionner avec. Est-ce que c'est juste une valeur fausse par défaut?

+0

Vous avez essayé d'exécuter ce code? Sinon, essayez et vous verrez. Ou imaginez ce qui se passerait si la méthode Exists renvoyait null au lieu de la tâche – Evk

+0

Eh bien, 'await' peut être en train de jeter la vérification de type, mais à quoi s'attendriez-vous que le résultat soit si' repository' est null? –

Répondre

7

Le problème est l'attente. Le nullable se passe avant l'attente, donc c'est comme await (this.repository?.Exists(id)), qui, lorsque ce.repository est nul, se transforme en await (null?.Exists(id)), qui se transforme en await (null), qui se bloque. Le ?. n'est pas capable d'atteindre le Task<bool> et le rendre Task<bool?>.

Ainsi vous obtiendrez le booléen approprié, ou une exception.

+0

Ah c'est logique, merci d'avoir expliqué cela. Je ferais mieux de le changer ensuite. – Drew

+0

@ChadNedzlek - Selon votre réponse à ma question, je pense que c'est une bonne réponse et m'a donné l'information que je cherchais. Je pense que si vous postez une section particulière de cet article, la réponse sera bonne et je vais upvote et accepter. J'apprécie votre réponse :) –