2017-06-13 1 views
1

J'ai un event qui renvoie un boolean. Pour m'assurer que l'événement n'est déclenché que si quelqu'un écoute, je l'appelle en utilisant l'opérateur null-conditionnel (questionmark). Cependant, cela signifie que je dois aussi ajouter l'opérateur null-conditionnel au booléen retourné. Et cela signifie que je ne peux pas comprendre comment l'utiliser dans une déclaration if après. Est-ce que quelqu'un sait comment gérer cela?Valeur booléenne null-conditionnelle dans if

switch (someInt) 
{ 
    case 1: 
     // Validate if the form is filled correctly. 
     // The event returns true if that is the case. 
     bool? isValid = ValidateStuff?.Invoke(); 

     if (isValid) 
      // If passed validation go to next step in form 
      GoToNextStep?.Invoke(); 
     break; 

    // There are more cases, but you get the point 
    (...) 
} 

Répondre

7

Vous pouvez utiliser

if (isValid.GetValueOrDefault()) 

qui donnera false si isValid est null.

ou utilisez l'opérateur ??

if (isValid ?? false) 

qui retourne la valeur de l'opérande gauche si elle n'est pas null et la valeur du droit opérande autrement. Donc, fondamentalement, un raccourci pour

if (isValid == null ? isValid : false) 
+0

Merci pour la réponse, je me suis retrouvé à l'aide de la 'si (isValid ?? faux) ', mais j'aime le concept d'avoir quelques options différentes :-) – Noceo

2

Une option serait de tester wether isValid a une valeur:

if (isValid.HasValue && (bool)isValid) 

Une autre option est de donner isValid une valeur par défaut quand personne écoute votre événement. Cela peut être fait avec l'opérateur coalescent null:

bool isValid = ValidateStuff?.Invoke() ?? true; // assume it is valid when nobody listens 
2

Vous pouvez utiliser ceci:

if (isValid.HasValue && isValid.Value) 
+0

Merci beaucoup. J'ai édité. –

1

Le problème est qu'en cas de Nullablebool? vous three-valued logic: true, false et null et ainsi vous devez mettre explicitement doit null être traité comme true, par exemple:

if (isValid != false)  // either true or null 
    GoToNextStep?.Invoke(); 

ou null sont considérés comme false:

if (isValid == true)  // only true 
    GoToNextStep?.Invoke(); 
+0

Merci d'avoir signalé la cause première (la logique à trois valeurs). Votre lien semble être un peu cassé (rien que je n'ai pas pu réparer). – Noceo

+0

@Noceo: merci! Le lien a en effet été brisé, j'ai édité la réponse. –