Преобразовать обнуляемый бул? кипеть - PullRequest
105 голосов
/ 20 мая 2011

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

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

Ответы [ 11 ]

153 голосов
/ 20 мая 2011

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

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

Или:

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

Или:

bool newBool = x ?? false;
99 голосов
/ 20 мая 2011

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

Пример:

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

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

80 голосов
/ 20 мая 2011

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

 bool? nullableBool = null;

 bool actualBool = nullableBool.GetValueOrDefault();
5 голосов
/ 20 мая 2011

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

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

}

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

4 голосов
/ 20 мая 2011

Если вы собираетесь использовать bool? в выражении 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"; }

Конечно, вы также можете сравнивать с нулем.

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

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

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

bool? b = ...;
if(b == null)
    throw new ArgumentNullException();
else
    SomeFunc(b.Value);
3 голосов
/ 20 мая 2011
bool? a = null;
bool b = Convert.toBoolean(a); 
2 голосов
/ 04 декабря 2015

Этот ответ предназначен для случая использования, когда вы просто хотите проверить 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;
2 голосов
/ 20 мая 2011

Полный путь будет:

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

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

bool b3 = (b2 == true); // b2 is true, not false or null
2 голосов
/ 20 мая 2011

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

if (bn.HasValue)
{
  b = bn.Value
}
0 голосов
/ 10 июня 2019

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

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

...