Перетворити нульовий bool? до кипіння


122

Як перетворити обнуляється bool?до boolв C #?

Я спробував x.Valueабо x.HasValue...

Відповіді:


200

Ви, зрештою, повинні вирішити, що буде являти собою нульовий 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або буде викинуто виняток?
Люк Т О’Браєн

Це навіть компілюється?
Кен Песписа

Так - це було запропоновано в "Швидкій дії" для Linqзаяви "Де", я не міг зрозуміти, чому lifted operators, здається, не працює всередині Linq (можливо, це просто VB.NET?) - Я щойно перевірив і це кидає недійсний виняток у ролях
Luke T O'Brien

Люблю це! :) Дякую!
прагуан

Або: bool newBool ​​= x == true;
Нік Вестгейт

104

Ви можете скористатися оператором null-coalescing :, 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()метод. Це поверне помилкове значення, якщо недійсне.

 bool? nullableBool = null;

 bool actualBool = nullableBool.GetValueOrDefault();

6
Я думаю, що це найкращий гібрид між стислістю та зручністю C #. Також зауважте, що є перевантаження, де можна вказати значення за замовчуванням.
Філ

4
Мені подобається використовувати цей метод, тому що він може створювати "елегантні", якщо висловлюванняif (nullableBool.GetValueOrDefault())
Люк Воллантс

9

Якщо ви збираєтесь використовувати 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.

Якщо ви збираєтеся перетворити його в bool, щоб передати його іншим частинам програми, то оператор Null Coalesce - це те, що ви хочете.

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);

5

Найпростіший спосіб - скористатися оператором з’єднання нуля: ??

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

}

Значення ??з нульовими значеннями працює, вивчаючи поданий нульовий вираз. Якщо виразний вираз має значення, його значення буде використано інакше, воно буде використовувати вираз праворуч від??



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
}

Вищенаведене, якщо буде істинним, лише якщо 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.