2012-12-18 16 views
14

Z tym kodem:Jak mogę zwrócić wartość bool z mnóstwa zerowych zmiennych?

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

... Ja zatrzymał jak wryty z

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

Więc jak to osiągnąć?

+0

W tym przypadku cztery. –

+1

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

Odpowiedz

31

Można łańcuchowe wraz | s, używając operatora null koalescencyjny na koniec:

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

Podniesiony operator | zwraca true, jeśli Operandem jest true, false, jeśli oba argumenty to false i null, jeśli jeden z operandów jest null, a drugi nie jest true.

To nie jest zwarcie, ale nie sądzę, że będzie to dla ciebie problem w tym przypadku.

Alternatywnie - i bardziej ekstensywnie - umieść pola wyboru w jakiejś kolekcji. Wtedy możesz po prostu użyć:

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

W końcu wiem, co znaczy "podniósł". Napotkałem ten termin podczas pracy z drzewkami wyrażeń. –

+0

Ciekawi mnie również ten termin, ale wygląda na to [Jon już odpowiedział na to pytanie] (http://stackoverflow.com/questions/3370110/what-are-lifted-operators) –

+0

Ponownie zagłosowałem na to pytanie . Wow, to jest sexy. –

4

można użyć następujących:

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

Jakoś to "czuje" się lepiej .. –

+2

Czy '||' powinien być operatorem '&&'? Jeśli "cbx1.IsChecked.HasValue" jest "false", podczas pobierania "ckbx1.IsChecked.Value" pojawi się 'Null Reference'. –

11

Spróbuj:

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

Darnit, pokonaj mnie! –

6

Zakładam, że jeśli null, to będzie to fałsz, możesz użyć? operator.

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

Użyj operatora ?? wewnątrz metody;

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

Można użyć GetValueOrDefault() dostać albo wartość lub false.

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