Konwersja wartości nullable bool? to bool


122

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

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

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;

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.


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();

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);

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??



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


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;

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
}

-2

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

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

Korzystając z naszej strony potwierdzasz, że przeczytałeś(-aś) i rozumiesz nasze zasady używania plików cookie i zasady ochrony prywatności.
Licensed under cc by-sa 3.0 with attribution required.