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