¿Convertir bool que acepta valores NULL? bool


122

¿Cómo se convierte un anulable bool?en boolen C #?

Lo he intentado x.Valueo x.HasValue...

Respuestas:


200

En última instancia, debe decidir qué representará el bool nulo. Si nulles así false, puede hacer esto:

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

O:

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

O:

bool newBool = x ?? false;

¿Y VB.NETsi lo haces dim newBool as Boolean = CBool(x)? ¿ nullSe convertirá en falseo se lanzará una excepción?
Luke T O'Brien

¿Eso incluso se compila?
Ken Pespisa

Sí, lo hace: se sugirió en una 'Acción rápida' para una Linqcláusula de declaración 'Dónde', no pude entender por qué lifted operatorsno parecía funcionar dentro de Linq (¿tal vez sea solo VB.NET?) - Acabo de probar y arroja una excepción de lanzamiento no válida
Luke T O'Brien

¡Gusta! :) ¡Gracias!
Praga

O: bool newBool ​​= x == true;
Nick Westgate

104

Puede usar el operador de fusión nula :, x ?? somethingdonde somethinges un valor booleano que desea usar si xes null.

Ejemplo:

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

newBool será falso.


1
Entonces,bool? myBool = null; bool newBool = myBool ?? false;
CaffGeek

86

Puedes usar el Nullable{T} GetValueOrDefault()método. Esto devolverá falso si es nulo.

 bool? nullableBool = null;

 bool actualBool = nullableBool.GetValueOrDefault();

6
Creo que este es el mejor híbrido entre la concisión y la compatibilidad con los novatos de C #. También tenga en cuenta que hay una sobrecarga en la que puede especificar el valor predeterminado.
Phil

4
Me gusta usar este método, porque puede crear declaraciones if 'elegantes'if (nullableBool.GetValueOrDefault())
Luc Wollants

9

Si va a utilizar el bool?en una ifdeclaración, creo que lo más fácil de hacer es comparar con trueo 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"; }

Por supuesto, también puede comparar con null.

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.

Si va a convertirlo en un bool para pasarlo a otras partes de la aplicación, entonces el operador Null Coalesce es lo que desea.

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

Si ya ha verificado el valor nulo y solo desea el valor, acceda a la propiedad Valor.

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

5

La forma más sencilla es utilizar el operador de fusión nula: ??

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

}

Los ??valores que aceptan valores NULL funcionan examinando la expresión que admite valores NULL proporcionada. Si la expresión que acepta valores NULL tiene un valor, se usará su valor; de lo contrario, usará la expresión a la derecha de??



2

La forma completa sería:

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

O puede probar valores específicos usando

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


2

Esta respuesta es para el caso de uso cuando simplemente desea probar el bool?en una condición. También se puede usar para obtener una normalidad bool. Es una alternativa que personalmente encuentro más fácil de leer que el coalescing operator ??.

Si desea probar una condición, puede usar este

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

Lo anterior if será cierto solo si el bool?es verdadero.

También puede usar esto para asignar un regular boolde unbool?

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

bruja es lo mismo que

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

0

Ésta es una variación interesante del tema. A primera y segunda mirada, asumiría que se ha tomado la verdadera rama. ¡No tan!

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

La forma de obtener lo que desea es hacer esto:

if (!(flag ?? true))
{
    // false branch
}
else
{
    // true branch
}

-2

System.Convert funciona bien para mí.

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

Al usar nuestro sitio, usted reconoce que ha leído y comprende nuestra Política de Cookies y Política de Privacidad.
Licensed under cc by-sa 3.0 with attribution required.