Конвертировать nullable bool? в бул


как вы преобразуете nullable bool? до bool в C#?

Я пробовал x.Value или x.HasValue ...

10 85

10 ответов:

вы в конечном счете должны решить, что будет представлять нулевой bool. Если null должно быть false, вы можете сделать это:

bool newBool = x.HasValue ? x.Value : false;

или:

bool newBool = x.HasValue && x.Value;

или:

bool newBool = x ?? false;

можно использовать нуль-коалесцирующий оператор: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();

самый простой способ-использовать оператор слияния null:??

bool? x = ...;
if (x ?? true) { 

}

The ?? со значениями null работ по изучению представленных выражение nullable. Если nullable выражение имеет значение, то это значение будет использоваться иначе он будет использовать выражение справа от ??

если вы собираетесь использовать 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"; }

конечно, вы также можете сравнить с 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);

полный путь будет такой:

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); 

что-то типа:

if (bn.HasValue)
{
  b = bn.Value
}

это ответ для случая использования, когда вы просто хотите испытать bool? в состояние. Он также может быть использован, чтобы получить нормальный bool. Это альтернатива, которую я лично нахожу легче читать, чем coalescing operator ??.

если вы хотите проверить условие, вы можете использовать это

bool? nullableBool = someFunction();
if(nullableBool == true)
{
    //Do stuff
}

выше если будет true, только если 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
}