Відповіді:
Ви, зрештою, повинні вирішити, що буде являти собою нульовий bool. Якщо null
має бути false
, ви можете зробити це:
bool newBool = x.HasValue ? x.Value : false;
Або:
bool newBool = x.HasValue && x.Value;
Або:
bool newBool = x ?? false;
Linq
заяви "Де", я не міг зрозуміти, чому lifted operators
, здається, не працює всередині Linq (можливо, це просто VB.NET?) - Я щойно перевірив і це кидає недійсний виняток у ролях
Ви можете скористатися оператором null-coalescing :, x ?? something
де something
булеве значення, яке ви хочете використовувати, якщо x
є null
.
Приклад:
bool? myBool = null;
bool newBool = myBool ?? false;
newBool
буде помилковим.
bool? myBool = null; bool newBool = myBool ?? false;
Можна використовувати Nullable{T}
GetValueOrDefault()
метод. Це поверне помилкове значення, якщо недійсне.
bool? nullableBool = null;
bool actualBool = nullableBool.GetValueOrDefault();
if (nullableBool.GetValueOrDefault())
Якщо ви збираєтесь використовувати 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);
Найпростіший спосіб - скористатися оператором з’єднання нуля: ??
bool? x = ...;
if (x ?? true) {
}
Значення ??
з нульовими значеннями працює, вивчаючи поданий нульовий вираз. Якщо виразний вираз має значення, його значення буде використано інакше, воно буде використовувати вираз праворуч від??
Ця відповідь стосується випадків використання, коли ви просто хочете перевірити 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;
Це цікава варіація теми. На перший і другий погляд ви б припустили, що справжня гілка взята. Не так!
bool? flag = null;
if (!flag ?? true)
{
// false branch
}
else
{
// true branch
}
Спосіб отримати те, що ви хочете, це зробити:
if (!(flag ?? true))
{
// false branch
}
else
{
// true branch
}
System.Convert добре працює за мною.
using System;
...
Bool fixed = Convert.ToBoolean(NullableBool);
VB.NET
якщо ви робитеdim newBool as Boolean = CBool(x)
:? Будеnull
конвертованоfalse
або буде викинуто виняток?