Nullable Bool konvertieren? zu boolen

121

Wie konvertiert man eine Null bool?in boolin C #?

Ich habe es versucht x.Valueoder x.HasValue...

KentZhou
quelle

Antworten:

199

Sie müssen letztendlich entscheiden, was der Null-Bool darstellen soll. Wenn nullsollte es sein false, können Sie dies tun:

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

Oder:

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

Oder:

bool newBool = x ?? false;
Ken Pespisa
quelle
Was ist mit in, VB.NETwenn Sie tun : dim newBool as Boolean = CBool(x)? Wird nullkonvertiert falseoder wird eine Ausnahme ausgelöst?
Luke T O'Brien
Kompiliert das überhaupt?
Ken Pespisa
Ja, das tut es. Es wurde in einer 'Quick Action' für eine LinqAnweisung 'Where'-Klausel vorgeschlagen. Ich konnte nicht verstehen, warum lifted operatorses in Linq nicht zu funktionieren schien (vielleicht ist es nur VB.NET?). Ich habe es gerade getestet und es wirft eine ungültige Besetzungsausnahme
Luke T O'Brien
Mag ich! :) Danke!
Praguan
Oder: bool newBool ​​= x == true;
Nick Westgate
104

Sie können den Null-Koaleszenz-Operator verwenden : x ?? something, wobei somethingein boolescher Wert ist, den Sie verwenden möchten, wenn xis null.

Beispiel:

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

newBool wird falsch sein.

SLaks
quelle
1
Also,bool? myBool = null; bool newBool = myBool ?? false;
CaffGeek
85

Sie können Nullable{T} GetValueOrDefault()Methode verwenden. Dies gibt false zurück, wenn null.

 bool? nullableBool = null;

 bool actualBool = nullableBool.GetValueOrDefault();
Joel Briggs
quelle
6
Ich denke, dies ist die beste Mischung aus Prägnanz und C # Noob-Freundlichkeit. Beachten Sie auch, dass es eine Überlastung gibt, bei der Sie den Standardwert angeben können.
Phil
4
Ich mag diese Methode, weil sie 'elegante' if-Anweisungen erzeugen kannif (nullableBool.GetValueOrDefault())
Luc Wollants
9

Wenn Sie das bool?in einer ifAnweisung verwenden, ist es für mich am einfachsten, es mit entweder trueoder zu vergleichen 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"; }

Natürlich können Sie auch mit Null vergleichen.

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.

Wenn Sie es in einen Bool konvertieren, um es an andere Teile der Anwendung weiterzuleiten, ist der Null Coalesce-Operator genau das, was Sie wollen.

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

Wenn Sie bereits auf null geprüft haben und nur den Wert möchten, greifen Sie auf die Value-Eigenschaft zu.

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

Am einfachsten ist es, den Null-Koaleszenz-Operator zu verwenden: ??

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

}

Das ??mit nullbaren Werten funktioniert, indem der bereitgestellte nullbare Ausdruck untersucht wird. Wenn der nullfähige Ausdruck einen Wert hat, wird sein Wert verwendet, andernfalls wird der Ausdruck rechts von verwendet??

JaredPar
quelle
3
bool? a = null;
bool b = Convert.toBoolean(a); 
Patrick
quelle
2

Der vollständige Weg wäre:

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

Oder Sie können mit auf bestimmte Werte testen

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

Etwas wie:

if (bn.HasValue)
{
  b = bn.Value
}
manojlds
quelle
2

Diese Antwort ist für den Anwendungsfall gedacht, wenn Sie das einfach bool?in einem Zustand testen möchten . Es kann auch verwendet werden, um eine normale zu bekommen bool. Es ist eine Alternative, die ich persönlich leichter zu lesen finde als die coalescing operator ??.

Wenn Sie eine Bedingung testen möchten, können Sie diese verwenden

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

Das obige Wenn wird nur wahr sein, wenn das bool?wahr ist.

Sie können dies auch verwenden, um eine reguläre boolvon a zuzuweisenbool?

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

Hexe ist das gleiche wie

bool? nullableBool = someFunction();
bool regularBool = nullableBool ?? false;
Rémi
quelle
0

Dies ist eine interessante Variation des Themas. Auf den ersten und zweiten Blick würden Sie annehmen, dass der wahre Zweig genommen wird. Nicht so!

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

Der Weg, um das zu bekommen, was Sie wollen, ist folgender:

if (!(flag ?? true))
{
    // false branch
}
else
{
    // true branch
}
stevieg
quelle
-2

System.Convert funktioniert gut von mir.

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

schockierende Lemi
quelle