C#:¿comparar explícitamente bool? con verdadero/falso para evitar errores en tiempo de compilación y excepciones en tiempo de ejecución

C#:¿comparar explícitamente bool? con verdadero/falso para evitar errores en tiempo de compilación y excepciones en tiempo de ejecución

No puede usar bools anulables (¿bool?) exactamente como bools regulares, porque no son lo mismo. Cuando intenta usarlos como bools regulares, se encuentra con errores de compilación y excepciones de tiempo de ejecución.

Afortunadamente, hay una manera simple y concisa de tratar los bools anulables casi como si fueran bools normales. Tienes que compararlos explícitamente con verdadero/falso. Por ejemplo, para verificar si un bool anulable es verdadero, puede hacer lo siguiente:

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

Esto puede parecer extraño, pero es más simple y conciso que las alternativas.

Este artículo muestra los diversos problemas con los que puede encontrarse si intenta utilizar bool? como un bool regular.

¿Problemas al tratar de usar bool? exactamente como un bool regular

La siguiente es una lista de posibles errores en tiempo de compilación y excepciones en tiempo de ejecución con las que puede encontrarse al usar bools anulables.

1 – ¿Usando bool? con operadores lógicos con otras variables en una declaración condicional

Cuando intentas usar un bool? variable en una declaración condicional con cualquier otra variable, con cualquier operador lógico, obtendrá un error de tiempo de compilación como el siguiente:

Ejemplo de código que da como resultado este error:

bool? nullableBool = null;
bool regularBool = true;

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

Obtendría un error de compilación similar si intentara usar un OR lógico.

2 – ¿Usando bool? por sí mismo en una declaración condicional

¿Obtiene un error diferente si intenta usar un bool? en una declaración condicional por sí mismo.

A continuación se muestra el código que daría como resultado ese error del compilador:

bool? nullableBool = null;

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

3 – Cuando se usa condicional nulo (?.) en una declaración condicional

Cuando usa el condicional nulo en una cadena de llamadas, intenta usar resultados booleanos como si fueran resultados booleanos anulables. Entonces, si está verificando el resultado en una declaración condicional, obtendrá uno de los errores de compilación mencionados anteriormente.

Por ejemplo, considere el siguiente código que usa el operador condicional nulo:

Person person = new Person();

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

Esto le dará el siguiente error de compilación:

¿Por qué? Todo después del ?. se vuelve anulable. Debido a que la llamada Any() es posterior al condicional nulo, lo trata como un bool anulable. En el punto número 2 anterior, vimos que no podemos usar bools anulables como este en una declaración condicional.

4 – ¿Usando el .Valor de bool nulo?

¿Un bool? tiene tres estados:nulo, verdadero y falso. Si el valor no se establece explícitamente, entonces es nulo. Si intenta usar .Value, obtendrá esta excepción de tiempo de ejecución:

El siguiente código da como resultado la excepción de tiempo de ejecución anterior:

bool? nullableBool = null;

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

Solución:¿usar bool? ==cierto

La solución es simple:compare explícitamente el bool anulable con verdadero/falso.

Por ejemplo, en lugar de esto:

bool? nullableBool = null;
bool regularBool = true;

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

Usa esto:

bool? nullableBool = null;
bool regularBool = true;

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