Konwersja wartości nullable bool? to bool

122

Jak przekonwertować wartość null bool?do boolw C #?

Próbowałem x.Valuelub x.HasValue...

KentZhou
źródło

Odpowiedzi:

201

Ostatecznie musisz zdecydować, co będzie reprezentować null bool. Jeśli nulltak false, możesz to zrobić:

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

Lub:

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

Lub:

bool newBool = x ?? false;
Ken Pespisa
źródło
A co w VB.NETrazie zrobić: dim newBool as Boolean = CBool(x)? Zostanie nullprzekonwertowany na falselub zostanie zgłoszony wyjątek?
Luke T. O'Brien
Czy to się w ogóle kompiluje?
Ken Pespisa
Tak - zasugerowano w `` Szybkiej akcji '' dla Linqklauzuli lifted operators`` Gdzie '', nie mogłem zrozumieć, dlaczego nie wydaje się działać w Linq (może to tylko VB.NET?) - Właśnie przetestowałem i rzuca nieprawidłowy wyjątek rzucany
Luke T. O'Brien
Lubię to! :) Dziękuję Ci!
praguan
Lub: bool newBool ​​= x == true;
Nick Westgate
104

Można użyć null zlewających operatora : x ?? something, gdzie somethingjest wartością logiczną, który chcesz użyć, jeżeli xjest null.

Przykład:

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

newBool będzie fałszywa.

SLaks
źródło
1
A więcbool? myBool = null; bool newBool = myBool ?? false;
CaffGeek
86

Możesz użyć Nullable{T} GetValueOrDefault()metody. To zwróci false, jeśli null.

 bool? nullableBool = null;

 bool actualBool = nullableBool.GetValueOrDefault();
Joel Briggs
źródło
6
Myślę, że jest to najlepsza hybryda między zwięzłością a przyjaznością dla noobów C #. Należy również zauważyć, że istnieje przeciążenie, w którym można określić wartość domyślną.
Phil
4
Podoba mi się ta metoda, ponieważ może ona tworzyć „eleganckie” stwierdzenia ifif (nullableBool.GetValueOrDefault())
Luc Wollants
9

Jeśli masz zamiar użyć bool?w ifoświadczeniu, wydaje mi się, że najłatwiej jest porównać je z albo truealbo 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"; }

Oczywiście możesz również porównać z 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.

Jeśli zamierzasz przekonwertować go na bool, aby przekazać go do innych części aplikacji, to operator Null Coalesce jest tym, czego potrzebujesz.

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

Jeśli już sprawdziłeś, czy nie ma wartości null, i chcesz tylko uzyskać wartość, uzyskaj dostęp do właściwości Value.

bool? b = ...;
if(b == null)
    throw new ArgumentNullException();
else
    SomeFunc(b.Value);
David Yaw
źródło
5

Najłatwiejszym sposobem jest użycie operatora koalescencji zerowej: ??

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

}

Z ??wartościami dopuszczającymi wartość null działa, sprawdzając podane wyrażenie dopuszczające wartość null. Jeśli wyrażenie dopuszczające wartość null ma wartość, zostanie użyta jego wartość, w przeciwnym razie użyje wyrażenia po prawej stronie??

JaredPar
źródło
3
bool? a = null;
bool b = Convert.toBoolean(a); 
patrick
źródło
2

Kompletny sposób byłby:

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

Lub możesz przetestować określone wartości za pomocą

bool b3 = (b2 == true); // b2 is true, not false or null
CodeNaked
źródło
2

Coś jak:

if (bn.HasValue)
{
  b = bn.Value
}
manojlds
źródło
2

Ta odpowiedź dotyczy przypadku użycia, gdy chcesz po prostu przetestować bool?stan w. Można go również użyć, aby uzyskać normalny bool. Jest to alternatywa, którą osobiście uważam za łatwiejszą do odczytania niżcoalescing operator ?? .

Jeśli chcesz przetestować stan, możesz użyć tego

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

Powyższe if będzie prawdziwe tylko wtedy, gdy bool? jest prawdziwe.

Możesz również użyć tego do przypisania regularnego boolzbool?

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

wiedźma jest taka sama jak

bool? nullableBool = someFunction();
bool regularBool = nullableBool ?? false;
Rémi
źródło
0

To ciekawa wariacja na ten temat. Na pierwszy i drugi rzut oka można założyć, że prawdziwa gałąź jest zajęta. Skąd!

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

Aby uzyskać to, czego chcesz, wykonaj następujące czynności:

if (!(flag ?? true))
{
    // false branch
}
else
{
    // true branch
}
stevieg
źródło
-2

System.Convert działa dobrze według mnie.

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

szokujący lemi
źródło