Ответы:
В конечном итоге вы должны решить, что будет представлять null 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?) - Я только что протестировал и это вызывает недопустимое исключение приведения
Вы можете использовать оператор объединения с нулевым значением :, x ?? something
где something
- логическое значение, которое вы хотите использовать, если x
есть null
.
Пример:
bool? myBool = null;
bool newBool = myBool ?? false;
newBool
будет ложным.
bool? myBool = null; bool newBool = myBool ?? false;
Вы можете использовать Nullable{T}
GetValueOrDefault()
метод. Это вернет false, если null.
bool? nullableBool = null;
bool actualBool = nullableBool.GetValueOrDefault();
if (nullableBool.GetValueOrDefault())
Если вы собираетесь использовать оператор 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);
Самый простой способ - использовать оператор объединения NULL: ??
bool? x = ...;
if (x ?? true) {
}
Объект ??
со значениями, допускающими значение NULL, работает путем проверки предоставленного выражения, допускающего значение NULL. Если выражение, допускающее значение NULL, имеет значение, оно будет использоваться, иначе оно будет использовать выражение справа от??
Этот ответ предназначен для случая использования, когда вы просто хотите протестировать 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;
Это интересная вариация на тему. На первый и второй взгляд можно предположить, что выбрана настоящая ветвь. Не так!
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
или возникнет исключение?