Преобразовать обнуляемый bool? в bool

#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
}