Nullable Bool konvertieren? zu boolen


121

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

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

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;

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.


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

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

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



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


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;

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
}

-2

System.Convert funktioniert gut von mir.

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

Durch die Nutzung unserer Website bestätigen Sie, dass Sie unsere Cookie-Richtlinie und Datenschutzrichtlinie gelesen und verstanden haben.
Licensed under cc by-sa 3.0 with attribution required.