¿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...

KentZhou
fuente

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;
Ken Pespisa
fuente
¿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.

SLaks
fuente
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();
Joel Briggs
fuente
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);
David Yaw
fuente
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??

JaredPar
fuente
3
bool? a = null;
bool b = Convert.toBoolean(a); 
Patricio
fuente
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
CodeNaked
fuente
2

Algo como:

if (bn.HasValue)
{
  b = bn.Value
}
manojlds
fuente
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;
Rémi
fuente
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
}
Stevieg
fuente
-2

System.Convert funciona bien para mí.

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

shocky lemi
fuente