Преобразовать значение nullable bool? болтать

122

Как преобразовать обнуляемый bool?к boolв C #?

Я пробовал x.Valueили x.HasValue...

KentZhou
источник

Ответы:

200

В конечном итоге вы должны решить, что будет представлять null bool. Если nullдолжно быть false, вы можете сделать это:

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

Или:

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

Или:

bool newBool = x ?? false;
Кен Песписа
источник
Что насчет того, VB.NETесли вы сделаете dim newBool as Boolean = CBool(x):? Будет nullпреобразовано в falseили возникнет исключение?
Люк Т О'Брайен
Это вообще компилируется?
Кен Песписа 08
Да, это так - это было предложено в «Быстрых действиях» для предложения Linq«Где», я не мог понять, почему lifted operators, похоже, не работает внутри Linq (возможно, это просто VB.NET?) - Я только что протестировал и это вызывает недопустимое исключение приведения
Люк Т О'Брайен
Нравится это! :) Спасибо!
praguan
Или: bool newBool ​​= x == true;
Ник Вестгейт,
104

Вы можете использовать оператор объединения с нулевым значением :, x ?? somethingгде something- логическое значение, которое вы хотите использовать, если xесть null.

Пример:

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

newBool будет ложным.

SLaks
источник
1
Итак,bool? myBool = null; bool newBool = myBool ?? false;
CaffGeek
86

Вы можете использовать Nullable{T} GetValueOrDefault()метод. Это вернет false, если null.

 bool? nullableBool = null;

 bool actualBool = nullableBool.GetValueOrDefault();
Джоэл Бриггс
источник
6
Я считаю, что это лучший гибрид лаконичности и удобства для новичков в C #. Также обратите внимание, что есть перегрузка, в которой вы можете указать значение по умолчанию.
Фил
4
Мне нравится использовать этот метод, потому что он может создавать «элегантные» операторы ifif (nullableBool.GetValueOrDefault())
Люк Волланц
9

Если вы собираетесь использовать оператор bool?in в ifоператоре, я считаю, что проще всего сравнить с одним trueили 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"; }

Конечно, вы также можете сравнить с 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.

Если вы собираетесь преобразовать его в логическое значение для передачи другим частям приложения, тогда вам нужен оператор Null Coalesce.

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

Если вы уже проверили значение null и вам просто нужно значение, перейдите к свойству Value.

bool? b = ...;
if(b == null)
    throw new ArgumentNullException();
else
    SomeFunc(b.Value);
Дэвид Яу
источник
5

Самый простой способ - использовать оператор объединения NULL: ??

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

}

Объект ??со значениями, допускающими значение NULL, работает путем проверки предоставленного выражения, допускающего значение NULL. Если выражение, допускающее значение NULL, имеет значение, оно будет использоваться, иначе оно будет использовать выражение справа от??

JaredPar
источник
3
bool? a = null;
bool b = Convert.toBoolean(a); 
Патрик
источник
2

Полный способ:

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

Или вы можете проверить конкретные значения, используя

bool b3 = (b2 == true); // b2 is true, not false or null
CodeNaked
источник
2

Что-то вроде:

if (bn.HasValue)
{
  b = bn.Value
}
manojlds
источник
2

Этот ответ предназначен для случая использования, когда вы просто хотите протестировать bool?в состоянии. Его также можно использовать для получения нормального bool. Это альтернатива, которую я лично считаю более легкой для чтения, чем coalescing operator ??.

Если вы хотите проверить условие, вы можете использовать это

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

Вышеупомянутое if будет истинным, только если bool?истинно.

Вы также можете использовать это, чтобы назначить постоянного клиента boolизbool?

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

ведьма такая же, как

bool? nullableBool = someFunction();
bool regularBool = nullableBool ?? false;
Рэй
источник
0

Это интересная вариация на тему. На первый и второй взгляд можно предположить, что выбрана настоящая ветвь. Не так!

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

Чтобы получить то, что вы хотите, нужно сделать следующее:

if (!(flag ?? true))
{
    // false branch
}
else
{
    // true branch
}
stevieg
источник
-2

System.Convert у меня отлично работает.

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

шокированный леми
источник