Как вы преобразовываете значение с нулевым значением bool?
в bool
в С#?
Я пробовал x.Value
или x.HasValue
...
Как вы преобразовываете значение с нулевым значением bool?
в bool
в С#?
Я пробовал x.Value
или x.HasValue
...
В конечном итоге вам нужно решить, что будет представлять нулевой bool. Если null
должно быть false
, вы можете сделать это:
bool newBool = x.HasValue ? x.Value : false;
Или:
bool newBool = x.HasValue && x.Value;
Или:
bool newBool = x ?? false;
Вы можете использовать оператор null-coalescing: x ?? something
, где something
- это логическое значение, которое вы хотите использовать, если x
- null
.
Пример:
bool? myBool = null;
bool newBool = myBool ?? false;
newBool
будет ложным.
Вы можете использовать метод Nullable{T}
GetValueOrDefault()
. Это вернет false, если null.
bool? nullableBool = null;
bool actualBool = nullableBool.GetValueOrDefault();
Самый простой способ - использовать нулевой коалесцирующий оператор: ??
bool? x = ...;
if (x ?? true) {
}
??
с нулевыми значениями работает, исследуя предоставленное выражение с возможностью NULL. Если значение с нулевым значением имеет значение, его значение будет использоваться иначе, оно будет использовать выражение справа от ??
Если вы собираетесь использовать 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
Если вы уже проверили значение null и просто хотите получить значение, обратитесь к свойству Value.
bool? b = ...;
if(b == null)
throw new ArgumentNullException();
else
SomeFunc(b.Value);
Что-то вроде:
if (bn.HasValue)
{
b = bn.Value
}
Полный способ:
bool b1;
bool? b2 = ???;
if (b2.HasValue)
b1 = b2.Value;
Или вы можете проверить определенные значения, используя
bool b3 = (b2 == true); // b2 is true, not false or null
bool? a = null;
bool b = Convert.toBoolean(a);
Это интересная вариация на тему. При первом и втором взглядах вы предполагаете, что берется истинная ветвь. Не так!
bool? flag = null;
if (!flag ?? true)
{
// false branch
}
else
{
// true branch
}
Чтобы получить то, что вы хотите, выполните следующие действия:
if (!(flag ?? true))
{
// false branch
}
else
{
// true branch
}
Этот ответ предназначен для использования, когда вы просто хотите проверить bool?
в состоянии. Его также можно использовать для получения нормального bool
. Это альтернативный вариант я personnaly легче читать, чем coalescing operator ??
.
Если вы хотите протестировать условие, вы можете использовать этот
bool? nullableBool = someFunction();
if(nullableBool == true)
{
//Do stuff
}
Вышеприведенное if будет истинным, только если значение bool?
истинно.
Вы также можете использовать это для назначения регулярного bool
из bool?
bool? nullableBool = someFunction();
bool regularBool = nullableBool == true;
witch совпадает с
bool? nullableBool = someFunction();
bool regularBool = nullableBool ?? false;