#c# #nullable
#c# #обнуляемый
Вопрос:
Как преобразовать nullable bool?
в bool
в C #?
Я пробовал x.Value
или x.HasValue
…
Ответ №1:
В конечном итоге вам придется решить, что будет представлять нулевой bool. Если null
должно быть false
, вы можете сделать это:
bool newBool = x.HasValue ? x.Value : false;
Или:
bool newBool = x.HasValue amp;amp; x.Value;
Или:
bool newBool = x ?? false;
Комментарии:
1. Что будет в,
VB.NET
если вы сделаете:dim newBool as Boolean = CBool(x)
? Будетnull
преобразован вfalse
или будет выдано исключение?2. Это вообще компилируется?
3. Да, это так — это было предложено в «Быстром действии» для
Linq
предложения ‘Where’, я не мог понять, почемуlifted operators
, похоже, не работает внутри Linq (возможно, это просто VB.NET ?) — Я только что протестировал, и он выдает недопустимое исключение приведения4. Нравится! 🙂 Спасибо!
5. Или: bool newBool = x == true;
Ответ №2:
Вы можете использовать оператор объединения с нулем: x ?? something
, где something
— логическое значение, которое вы хотите использовать, если x
равно null
.
Пример:
bool? myBool = null;
bool newBool = myBool ?? false;
newBool
будет равно false.
Комментарии:
1. Итак,
bool? myBool = null; bool newBool = myBool ?? false;
Ответ №3:
Вы можете использовать Nullable{T}
GetValueOrDefault()
метод. Это вернет false, если null.
bool? nullableBool = null;
bool actualBool = nullableBool.GetValueOrDefault();
Комментарии:
1. Я думаю, что это лучший гибрид между лаконичностью и удобством C # для новичков. Также обратите внимание, что существует перегрузка, при которой вы можете указать значение по умолчанию.
2. Мне нравится использовать этот метод, потому что он может создавать «элегантные» операторы if
if (nullableBool.GetValueOrDefault())
Ответ №4:
Если вы собираетесь использовать оператор 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.
Если вы собираетесь преобразовать его в 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);
Ответ №5:
Самый простой способ — использовать оператор объединения null: ??
bool? x = ...;
if (x ?? true) {
}
??
С обнуляемыми значениями работает путем проверки предоставленного обнуляемого выражения. Если обнуляемое выражение имеет значение, будет использоваться его значение, иначе оно будет использовать выражение справа от ??
Ответ №6:
Этот ответ предназначен для случая использования, когда вы просто хотите протестировать bool?
в условии. Его также можно использовать для получения нормального bool
. Лично я считаю, что это альтернатива, которую легче читать, чем coalescing operator ??
.
Если вы хотите проверить условие, вы можете использовать это
bool? nullableBool = someFunction();
if(nullableBool == true)
{
//Do stuff
}
Указанное выше if будет истинным, только если bool?
имеет значение true.
Вы также можете использовать это для назначения обычного bool
из bool?
bool? nullableBool = someFunction();
bool regularBool = nullableBool == true;
witch — это то же самое, что
bool? nullableBool = someFunction();
bool regularBool = nullableBool ?? false;
Ответ №7:
bool? a = null;
bool b = Convert.toBoolean(a);
Ответ №8:
Полный способ был бы:
bool b1;
bool? b2 = ???;
if (b2.HasValue)
b1 = b2.Value;
Или вы можете протестировать конкретные значения с помощью
bool b3 = (b2 == true); // b2 is true, not false or null
Ответ №9:
Что-то вроде:
if (bn.HasValue)
{
b = bn.Value
}
Ответ №10:
Это интересная вариация на тему. На первый и второй взгляд можно предположить, что взята истинная ветвь. Это не так!
bool? flag = null;
if (!flag ?? true)
{
// false branch
}
else
{
// true branch
}
Способ получить то, что вы хотите, — это сделать это:
if (!(flag ?? true))
{
// false branch
}
else
{
// true branch
}