Convertire nullable bool? a bool


122

Come si fa a convertire un nullable bool?a boolin C #?

Ho provato x.Valueo x.HasValue...

Risposte:


200

Alla fine devi decidere cosa rappresenterà il bool nullo. Se nulldovrebbe essere false, puoi farlo:

bool newBool = x.HasValue ? x.Value : false;

O:

bool newBool = x.HasValue && x.Value;

O:

bool newBool = x ?? false;

E VB.NETse fai dim newBool as Boolean = CBool(x):? Verrà nullconvertito in falseo verrà generata un'eccezione?
Luke T O'Brien

Viene compilato?
Ken Pespisa

Sì, è stato suggerito in una "Azione rapida" per una Linqclausola "Where" dell'istruzione, non riuscivo a capire perché lifted operatorsnon sembrava funzionare all'interno di Linq (forse è solo VB.NET?) - Ho appena testato e genera un'eccezione di lancio non valida
Luke T O'Brien

Mi piace! :) Grazie!
praguan

Oppure: bool newBool ​​= x == true;
Nick Westgate

104

È possibile utilizzare il null coalescenza operator : x ?? something, dove somethingè un valore booleano che si desidera utilizzare, se xè null.

Esempio:

bool? myBool = null;
bool newBool = myBool ?? false;

newBool sarà falso.


1
Quindi,bool? myBool = null; bool newBool = myBool ?? false;
CaffGeek

86

Puoi usare il Nullable{T} GetValueOrDefault()metodo. Questo restituirà false se null.

 bool? nullableBool = null;

 bool actualBool = nullableBool.GetValueOrDefault();

6
Penso che questo sia il miglior ibrido tra concisione e C # noob-friendly. Notare inoltre che è presente un sovraccarico in cui è possibile specificare il valore predefinito.
Phil

4
Mi piace usare questo metodo, perché può creare istruzioni if ​​'eleganti'if (nullableBool.GetValueOrDefault())
Luc Wollants

9

Se hai intenzione di utilizzare bool?in ifun'istruzione, trovo che la cosa più semplice da fare sia confrontare con trueo false.

bool? b = ...;

if (b == true) { Debug.WriteLine("true"; }
if (b == false) { Debug.WriteLine("false"; }
if (b != true) { Debug.WriteLine("false or null"; }
if (b != false) { Debug.WriteLine("true or null"; }

Ovviamente puoi anche confrontare con null.

bool? b = ...;

if (b == null) { Debug.WriteLine("null"; }
if (b != null) { Debug.WriteLine("true or false"; }
if (b.HasValue) { Debug.WriteLine("true or false"; }
//HasValue and != null will ALWAYS return the same value, so use whatever you like.

Se hai intenzione di convertirlo in un bool per passare ad altre parti dell'applicazione, l'operatore Null Coalesce è quello che vuoi.

bool? b = ...;
bool b2 = b ?? true; // null becomes true
b2 = b ?? false; // null becomes false

Se hai già verificato la presenza di null e desideri solo il valore, accedi alla proprietà Value.

bool? b = ...;
if(b == null)
    throw new ArgumentNullException();
else
    SomeFunc(b.Value);

5

Il modo più semplice è utilizzare l'operatore di coalescenza null: ??

bool? x = ...;
if (x ?? true) { 

}

Con ??valori nullable funziona esaminando l'espressione nullable fornita. Se l'espressione nullable ha un valore, verrà usato il suo valore altrimenti userà l'espressione a destra di??



2

Il modo completo sarebbe:

bool b1;
bool? b2 = ???;
if (b2.HasValue)
   b1 = b2.Value;

Oppure puoi testare valori specifici usando

bool b3 = (b2 == true); // b2 is true, not false or null

2

Qualcosa di simile a:

if (bn.HasValue)
{
  b = bn.Value
}

2

Questa risposta è per il caso d'uso in cui si desidera semplicemente testare bool?in una condizione. Può anche essere usato per ottenere un normale bool. È un'alternativa che personalmente trovo più facile da leggere rispetto a coalescing operator ??.

Se vuoi testare una condizione, puoi usarla

bool? nullableBool = someFunction();
if(nullableBool == true)
{
    //Do stuff
}

Quanto sopra se sarà vero solo se bool?è vero.

Puoi anche usarlo per assegnare un normale boolda un filebool?

bool? nullableBool = someFunction();
bool regularBool = nullableBool == true;

la strega è la stessa di

bool? nullableBool = someFunction();
bool regularBool = nullableBool ?? false;

0

Questa è una variazione interessante sul tema. Al primo e al secondo sguardo si presume che il vero ramo sia stato preso. Non così!

bool? flag = null;
if (!flag ?? true)
{
    // false branch
}
else
{
    // true branch
}

Il modo per ottenere quello che vuoi è fare questo:

if (!(flag ?? true))
{
    // false branch
}
else
{
    // true branch
}

-2

System.Convert funziona bene per me.

using System; ... Bool fixed = Convert.ToBoolean(NullableBool);

Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.