Converter bool anulável? bool

121

Como você converter um anulável bool?a boolem C #?

Eu tentei x.Valueou x.HasValue...

KentZhou
fonte

Respostas:

199

Você precisa decidir o que o bool nulo representará. Se nullfor false, você pode fazer isso:

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

Ou:

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

Ou:

bool newBool = x ?? false;
Ken Pespisa
fonte
E VB.NETse você fizer dim newBool as Boolean = CBool(x):? Será nullconvertido para falseou será lançada uma exceção?
Luke T O'Brien
Isso compila mesmo?
217127 Ken Pessisa
Sim, sim - foi sugerido na Linqcláusula 'Ação rápida' para uma declaração 'Onde', eu não conseguia entender por lifted operatorsque parecia não funcionar no Linq (talvez seja apenas o VB.NET?) - Acabei de testar e ele faz lançar uma exceção de elenco inválido
Luke T O'Brien
Gosto disso! :) Obrigado!
praguan
Ou: bool newBool ​​= x == true;
Nick Westgate
104

Você pode usar o operador coalescentes nulo : x ?? something, onde somethingé um valor booleano que você deseja usar, se xé null.

Exemplo:

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

newBool será falso.

SLaks
fonte
1
Então,bool? myBool = null; bool newBool = myBool ?? false;
CaffGeek
85

Você pode usar o Nullable{T} GetValueOrDefault()método Isso retornará false se nulo.

 bool? nullableBool = null;

 bool actualBool = nullableBool.GetValueOrDefault();
Joel Briggs
fonte
6
Eu acho que esse é o melhor híbrido entre concisão e facilidade de uso em C #. Observe também que há uma sobrecarga na qual você pode especificar o valor padrão.
20511 Phil
4
Eu gosto de usar esse método, porque ele pode criar instruções if 'elegantes'if (nullableBool.GetValueOrDefault())
#
9

Se você usar o bool?em uma ifdeclaração, acho que a coisa mais fácil é comparar com um trueou outro 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"; }

Obviamente, você também pode comparar com nulos.

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.

Se você deseja convertê-lo em um booleano para passar para outras partes do aplicativo, o operador Null Coalesce é o que você deseja.

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

Se você já verificou nulo e deseja apenas o valor, acesse a propriedade Value.

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

A maneira mais fácil é usar o operador coalescente nulo: ??

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

}

Os ??valores com valor nulo funcionam examinando a expressão nulo fornecida. Se a expressão anulável tiver um valor, seu valor será usado. Caso contrário, ela usará a expressão à direita de??

JaredPar
fonte
3
bool? a = null;
bool b = Convert.toBoolean(a); 
patrick
fonte
2

A maneira completa seria:

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

Ou você pode testar valores específicos usando

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

Algo como:

if (bn.HasValue)
{
  b = bn.Value
}
manojlds
fonte
2

Esta resposta é para o caso de uso em que você simplesmente deseja testar a bool?condição. Também pode ser usado para obter um normal bool. É uma alternativa que eu pessoalmente acho mais fácil de ler do que a coalescing operator ??.

Se você deseja testar uma condição, pode usar este

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

O acima se será verdadeiro somente se o bool?for verdadeiro.

Você também pode usar isso para atribuir um regular boolde umbool?

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

bruxa é o mesmo que

bool? nullableBool = someFunction();
bool regularBool = nullableBool ?? false;
Rémi
fonte
0

Esta é uma variação interessante sobre o tema. No primeiro e no segundo olhar, você presumiria que o ramo verdadeiro foi obtido. Não tão!

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

A maneira de conseguir o que deseja é fazer o seguinte:

if (!(flag ?? true))
{
    // false branch
}
else
{
    // true branch
}
stevieg
fonte
-2

System.Convert funciona bem por mim.

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

lemi chocante
fonte