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


122

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

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

Ответы:


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 будет ложным.


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, имеет значение, оно будет использоваться, иначе оно будет использовать выражение справа от??



2

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

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

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

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


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
}

Используя наш сайт, вы подтверждаете, что прочитали и поняли нашу Политику в отношении файлов cookie и Политику конфиденциальности.
Licensed under cc by-sa 3.0 with attribution required.