Odpowiedzi:
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;
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
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.
bool? myBool = null; bool newBool = myBool ?? false;
Możesz użyć Nullable{T} GetValueOrDefault()metody. To zwróci false, jeśli null.
bool? nullableBool = null;
bool actualBool = nullableBool.GetValueOrDefault();
if (nullableBool.GetValueOrDefault())
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);
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??
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;
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
}
System.Convert działa dobrze według mnie.
using System;
...
Bool fixed = Convert.ToBoolean(NullableBool);
VB.NETrazie zrobić:dim newBool as Boolean = CBool(x)? Zostanienullprzekonwertowany nafalselub zostanie zgłoszony wyjątek?