2012-12-18 110 views
14

有了這個代碼:如何從多個可空的布爾中返回一個布爾值?

private bool AtLeastOnePlatypusChecked() 
{ 
    return ((ckbx1.IsChecked) || 
      (ckbx2.IsChecked) || 
      (ckbx3.IsChecked) || 
      (ckbx4.IsChecked)); 
} 

...我在我的軌道攔死與

Operator '||' cannot be applied to operands of type 'bool?' and 'bool? 

那麼,如何做到這一點?

+0

在這種情況下,四。 –

+1

http://www.merriam-webster.com/dictionary/plethora –

回答

31

你可以連續| S,使用空合併運算符結尾:

return (ckbx1.IsChecked | cxbx2.IsChecked | cxbx3.IsChecked | cxbx4.IsChecked) ?? false; 

解除|運算符返回true如果eith er操作數是true,false,如果兩個操作數都是false和如果任一操作數是null而另一個不是true

這不是短路,但我認爲在這種情況下你不會遇到問題。

或者 - 也可以更具擴展性 - 將複選框放入某種集合中。那麼你可以使用:

return checkboxes.Any(cb => cb.IsChecked ?? false); 
+0

最後我知道「解除」是什麼意思。我在處理表達式樹時遇到了這個術語。 –

+0

我對這個詞也很好奇,但它看起來像[Jon已經回答了那個問題](http://stackoverflow.com/questions/3370110/what-are-lifted-operators) –

+0

我已重新投票贊成。哇,這很性感。 –

4

您可以使用以下方法:

(ckbx1.IsChecked.HasValue && ckbx1.IsChecked.Value) 
+0

不知怎的,這「感覺」更好.. –

+2

應該'''是'&&'操作符?如果'cbx1.IsChecked.HasValue'爲'false',那麼在獲得'ckbx1.IsChecked.Value'時將會出現'Null Reference'。 –

11

嘗試:

return ((ckbx1.IsChecked ?? false) || 
     (ckbx2.IsChecked ?? false) || 
     ... 
+0

達尼特,打我吧! –

6

我假設如果null,那麼它會是假的,你可以使用?運營商。

private bool AtLeastOnePlatypusChecked() 
{ 
     return ((ckbx1.IsChecked ?? false) || 
     (ckbx2.IsChecked ?? false) || 
     (ckbx3.IsChecked ?? false) || 
     (ckbx4.IsChecked ?? false)); 
} 
2

在您的方法中使用??運算符;

private bool AtLeastOnePlatypusChecked() 
{ 
return ((ckbx1.IsChecked ?? false) || 
     (ckbx2.IsChecked ?? false) || 
     (ckbx3.IsChecked ?? false) || 
     (ckbx4.IsChecked ?? false) 
} 
5

您可以使用GetValueOrDefault()得到任何價值,或者false

private bool AtLeastOnePlatypusChecked() 
{ 
    return ((ckbx1.IsChecked.GetValueOrDefault()) || 
      (ckbx2.IsChecked.GetValueOrDefault()) || 
      (ckbx3.IsChecked.GetValueOrDefault()) || 
      (ckbx4.IsChecked.GetValueOrDefault())); 
}