2017-06-13 196 views
1

我有一个event,它返回boolean。为了确保只有当有人在倾听时才会触发事件,我使用空条件运算符(questionmark)调用它。 但是,这意味着我必须将null-conditional运算符添加到返回的布尔值中。这意味着我无法弄清楚如何在if语句中使用它。有谁知道如何处理这个?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 
    (...) 
} 

回答

7

你可以使用

if (isValid.GetValueOrDefault()) 

,这将给false如果isValidnull

或使用??操作

if (isValid ?? false) 

如果不是null和正确的操作数的值,否则返回左操作数的值。所以基本上对

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

谢谢你的答案,我结束了使用'如果(isValid方法?假)',但我喜欢有几个不同选择的概念:-) – Noceo

2

一种选择速记将是检验阉isValid有一个值:

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

另一种选择是给isValid默认值时,没有人听你的事件。这可以用空合并运算符来完成:

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

您可以使用此:

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

非常感谢。我编辑过。 –

1

的问题是,在可空bool?如果你有three-valued logictruefalsenull和因此您必须明确地将null视为true,例如:

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

null应视为false

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

感谢您指出根本原因(三值逻辑)。尽管你的链接似乎有点失败(我无法修复)。 – Noceo

+0

@Noceo:谢谢!链接确实已被打破,我已经编辑了答案。 –