2012-12-18 14 views
14

Con questo codice:Come posso restituire un valore bool da una pletora di bool nullable?

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

... sono fermato morto nel mio tracce con

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

Allora, come faccio ottenere questo risultato?

+0

In questo caso, quattro. –

+1

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

risposta

31

è possibile concatenare insieme | s, utilizzando l'operatore null coalescenza alla fine:

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

L'operatore sollevato | restituisce true se eith L'operando è true, false se entrambi gli operandi sono false e null se uno degli operandi è null e l'altro non è true.

Non si tratta di un cortocircuito, ma non penso che questo sarà un problema per te in questo caso.

In alternativa - e in modo più estensibile - inserire le caselle di controllo in una raccolta di qualche tipo. Poi si può semplicemente utilizzare:

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

Infine so cosa significa "sollevato". Ho incontrato questo termine quando lavoro con gli alberi di espressione. –

+0

Anche io ero curioso di questo termine, ma sembra che [Jon abbia già risposto a questa domanda] (http://stackoverflow.com/questions/3370110/what-are-lifted-operators) –

+0

Ho votato per questo . Wow è sexy. –

4

È possibile utilizzare il seguente:

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

In qualche modo questo "sembra" più bello .. –

+2

Se il '||' è l'operatore '&&'? Se 'cbx1.IsChecked.HasValue' è' false' allora ci sarà un 'Null Reference' quando si ottiene' ckbx1.IsChecked.Value'. –

11

Prova:

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

Darnit, bastonatemi! –

6

Sto assumendo che, se nulla, allora sarà falso, è possibile utilizzare il ?? operatore.

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

Utilizzare l'operatore ?? all'interno del metodo;

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

È possibile utilizzare GetValueOrDefault() per ottenere sia il valore, o false.

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