C# – bool explizit vergleichen? mit true/false, um Kompilierzeitfehler und Laufzeitausnahmen zu vermeiden

C# – bool explizit vergleichen? mit true/false, um Kompilierzeitfehler und Laufzeitausnahmen zu vermeiden

Sie können nullable boolesche Werte (bool?) nicht genau wie normale boolesche Werte verwenden, weil sie nicht dasselbe sind. Wenn Sie versuchen, sie wie normale bools zu verwenden, stoßen Sie auf Compilerfehler und Laufzeitausnahmen.

Glücklicherweise gibt es eine einfache, prägnante Möglichkeit, nullable boolesche Werte fast wie normale boolesche Werte zu behandeln. Sie müssen sie explizit mit wahr/falsch vergleichen. Um beispielsweise zu überprüfen, ob ein nullable bool wahr ist, können Sie Folgendes tun:

if (nullableBool == true)
Code language: C# (cs)

Das sieht vielleicht seltsam aus, ist aber einfacher und prägnanter als die Alternativen.

Dieser Artikel zeigt die verschiedenen Probleme, auf die Sie stoßen können, wenn Sie versuchen, bool? wie ein normaler bool.

Probleme bei der Verwendung von bool? genau wie ein normaler bool

Das Folgende ist eine Liste möglicher Kompilierzeitfehler und Laufzeitausnahmen, auf die Sie stoßen können, wenn Sie nullable boolesche Werte verwenden.

1 – Verwendung von bool? mit logischen Operatoren mit anderen Variablen in einer bedingten Anweisung

Wenn Sie versuchen, einen Bool zu verwenden? Variable in einer bedingten Anweisung mit jeder anderen Variablen, mit jedem logischen Operator, erhalten Sie einen Kompilierungsfehler wie den folgenden:

Beispielcode, der zu diesem Fehler führt:

bool? nullableBool = null;
bool regularBool = true;

if (nullableBool && regularBool)
Code language: C# (cs)

Sie würden einen ähnlichen Compiler-Fehler erhalten, wenn Sie versuchten, ein logisches ODER zu verwenden.

2 – Verwendung von bool? allein in einer bedingten Anweisung

Sie erhalten einen anderen Fehler, wenn Sie versuchen, einen Bool zu verwenden? in einer bedingten Anweisung selbst.

Das Folgende zeigt Code, der zu diesem Compilerfehler führen würde:

bool? nullableBool = null;

if (nullableBool)
Code language: C# (cs)

3 – Bei Verwendung von Null-Bedingungen (?.) in einer bedingten Anweisung

Wenn Sie die Null-Bedingung in einer Aufrufkette verwenden, versucht sie, bool-Ergebnisse so zu verwenden, als wären sie nullable bool-Ergebnisse. Wenn Sie also das Ergebnis in einer bedingten Anweisung überprüfen, erhalten Sie einen der zuvor erwähnten Compiler-Fehler.

Betrachten Sie beispielsweise den folgenden Code, der den nullbedingten Operator verwendet:

Person person = new Person();

if (person.Pets?.Any())
Code language: C# (cs)

Dadurch erhalten Sie den folgenden Compiler-Fehler:

Wieso den? Alles nach dem ?. wird nullable. Da der Any()-Aufruf nach der Null-Bedingung erfolgt, wird er wie ein nullable bool behandelt. In Punkt 2 oben haben wir gesehen, dass wir Nullable-Bools wie diese nicht in einer bedingten Anweisung verwenden können.

4 – Verwendung des .Value von null bool?

Ein bool? hat drei Zustände:null, wahr und falsch. Wenn der Wert nicht explizit festgelegt wird, ist er null. Wenn Sie versuchen, .Value zu verwenden, erhalten Sie diese Laufzeitausnahme:

Der folgende Code führt zur obigen Laufzeitausnahme:

bool? nullableBool = null;

if (nullableBool.Value)
Code language: C# (cs)

Lösung – bool verwenden? ==wahr

Die Lösung ist einfach:nullable bool explizit mit true/false vergleichen.

Zum Beispiel stattdessen:

bool? nullableBool = null;
bool regularBool = true;

if (nullableBool && regularBool)
Code language: C# (cs)

Verwenden Sie dies:

bool? nullableBool = null;
bool regularBool = true;

if (nullableBool == true && regularBool)
Code language: C# (cs)