C# – Confronta esplicitamente bool? con true/false per evitare errori in fase di compilazione ed eccezioni di runtime

C# – Confronta esplicitamente bool? con true/false per evitare errori in fase di compilazione ed eccezioni di runtime

Non puoi usare bool nullable (bool?) esattamente come i bool normali, perché non sono la stessa cosa. Quando provi a usarli come normali bool, ti imbatti in errori del compilatore ed eccezioni di runtime.

Fortunatamente, esiste un modo semplice e conciso per trattare i bool nullable quasi come i bool regolari. Devi confrontarli esplicitamente con vero/falso. Ad esempio, per verificare se un bool nullable è true, puoi effettuare le seguenti operazioni:

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

Può sembrare strano, ma è più semplice e conciso delle alternative.

Questo articolo mostra i vari problemi che potresti incontrare se provi a usare bool? come un normale bool.

Problemi durante il tentativo di utilizzare bool? esattamente come un normale bool

Di seguito è riportato un elenco di possibili errori in fase di compilazione ed eccezioni di runtime in cui è possibile imbattersi quando si utilizzano bool nullable.

1 – Usare bool? con operatori logici con altre variabili in un'istruzione condizionale

Quando provi a usare un bool? variabile in un'istruzione condizionale con qualsiasi altra variabile, con qualsiasi operatore logico, otterrai un errore in fase di compilazione come il seguente:

Esempio di codice che genera questo errore:

bool? nullableBool = null;
bool regularBool = true;

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

Otterresti un errore simile del compilatore se provassi a utilizzare un OR logico.

2 – Usare bool? da solo in una dichiarazione condizionale

Viene visualizzato un errore diverso se si tenta di utilizzare un bool? in una dichiarazione condizionale da solo.

Di seguito viene mostrato il codice che risulterebbe in quell'errore del compilatore:

bool? nullableBool = null;

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

3 – Quando si utilizza il condizionale nullo (?.) in un'istruzione condizionale

Quando si utilizza il condizionale null in una catena di chiamate, tenta di utilizzare i risultati bool come se fossero risultati bool nullable. Quindi, se stai controllando il risultato in un'istruzione condizionale, otterrai uno degli errori del compilatore menzionati in precedenza.

Ad esempio, considera il codice seguente che utilizza l'operatore condizionale null:

Person person = new Person();

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

Questo ti darà il seguente errore del compilatore:

Come mai? Tutto dopo il ?. diventa nullable. Poiché la chiamata Any() è dopo il condizionale null, lo tratta come un bool nullable. Nel punto numero 2 sopra, abbiamo visto che non possiamo usare bool nullable come questo in un'istruzione condizionale.

4 – Utilizzo del valore .Value di null bool?

Un bolo? ha tre stati:null, true e false. Se il valore non è impostato in modo esplicito, è null. Se provi a utilizzare .Value, otterrai questa eccezione di runtime:

Il codice seguente genera l'eccezione di runtime sopra:

bool? nullableBool = null;

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

Soluzione:usare bool? ==vero

La soluzione è semplice:confrontare esplicitamente il bool nullable con true/false.

Ad esempio, invece di questo:

bool? nullableBool = null;
bool regularBool = true;

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

Usa questo:

bool? nullableBool = null;
bool regularBool = true;

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