2016-03-02 3 views
1

Lors de l'attribution d'une valeur à partir d'une condition zéro, il est logique de renvoyer un type de valeur NULL. Sinon, si l'objet est nul, le null-conditionnel retournera la valeur par défaut du type de valeur et vous ne le voulez pas. C'est donc bon:Est-il possible que les conditions Null ne retournent pas les types de valeur NULL lors de la vérification des conditions?

bool? IsTerminated = Employee?.IsTerminated; 

Cependant, pourquoi est-il revenir un type nullable si je suis en train de vérifier une condition? On pourrait penser que le compilateur pourrait comprendre cela très bien:

if (Employee?.IsTerminated) { /*do something here*/ } 

Après tout, il est juste de compiler jusqu'à cela, non?

if (Employee != null && Employee.IsTerminated) { /*do something here*/ } 

Pour le faire fonctionner, je dois le faire:

if ((Employee?.IsTerminated).GetValueOrDefault()) { /*do something here*/ } 

Entre le code supplémentaire et d'avoir à envelopper l'expression dans parens, le but de la nulle conditionnelle est courte La syntaxe -hand semble être vaincue. Est-ce la bonne façon de gérer une valeur de retour null-conditionnelle ou existe-t-il un autre moyen qui n'implique pas de comptabiliser une valeur de retour Nullable?

+0

Vous pouvez utiliser '' si au lieu de 'GetValueOrDefault'. – Lee

Répondre

2

Si A?.B contient B d'un type de référence, vous obtiendrez un retour de type B. Dans le cas contraire, si B est un type de valeur, le type de retour est un type null autour du type B. Donc, c'est une réponse courte à votre question. Cela étant dit, dans votre cas, étant donné que vous obtenez un bool, il est compréhensible que ce soit bool?. Sachant cela, vous devriez simplement travailler avec comme vous le feriez normalement avec bool?. Une façon est de simplement faire une comparaison d'égalité à une valeur désirée de bool.

Par exemple:

if (Employee?.IsTerminated == true) { } 

Il est un peu plus court et plus facile à lire que:

if ((Employee?.IsTerminated).GetValueOrDefault()) { } 

La comparaison exemple fonctionne, car null ne sera jamais égale à une bool.

+0

Il s'avère donc que ce n'est qu'un problème avec les booléens, et probablement à cause des différences entre les expressions binaires (un opérateur de comparaison entre deux expressions) et une expression booléenne qui implique un opérateur d'égalité. Certainement beaucoup mieux que la façon dont je l'ai fait. – oscilatingcretin

+0

architectes de langage [en sont conscients] (https://github.com/dotnet/csharplang/issues/784), peut-être que si nous sommes chanceux, nous aurons un jour la possibilité de redéfinir l'opérateur afin que nous puissions faire plus intuitive 'bool b = foo? .booleanproperty'. À mon humble avis et connaissant les deux côtés de l'argument, cela devrait vraiment être le comportement par défaut *, car il est pratique *. – dlatikay

+1

@dlatikay Pour chacun est propre, je suppose. Pour moi, c'est plus intuitif: 'bool? b = foo? .booleanproperty'.C'est parce que si 'foo' est' null', je m'attendrais à ce que 'b' soit' null'; sinon, je m'attendrais à un 'bool'. Ainsi, un 'bool' nullable prend tout son sens. Je suppose que ce que vous suggérez est que si 'foo' est' null' alors 'b' serait' false'? Je peux voir l'attraction d'une telle conversion implicite, mais cela enlèverait en fait une certaine liberté pour décider quoi faire de la valeur. Si 'foo' est' null', j'aimerais le savoir dans certains cas, afin que mon code puisse le gérer correctement, au lieu de le masquer. –

0

Vous pouvez toujours utiliser l'opérateur soudent null: (employé .IsTerminated == true)

if (Employee?.IsTerminated ?? false) { /*do something here*/ }