Nullable bool dönüştürülsün mü? bool


122

Nasıl null dönüştürebilirim bool?için boolC #?

Denedim x.Valueya da x.HasValue...

Yanıtlar:


200

Null bool'un neyi temsil edeceğine nihayetinde karar vermelisiniz. Eğer nullolmalıdır false, bunu yapabilirsiniz:

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

Veya:

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

Veya:

bool newBool = x ?? false;

Ne yaklaşık içinde VB.NETbunu yaparsanız: dim newBool as Boolean = CBool(x)? Will nulldönüştürülebilir falseveya istisna atılır?
Luke T O'Brien

Bu bile derleniyor mu?
Ken Pespisa

Evet öyle - Bir 'Hızlı LinqEylem'de' Nerede 'cümlesi için önerildi, neden lifted operatorsLinq içinde çalışmıyor gibi göründüğünü anlayamadım (belki de sadece VB.NET?) - Sadece test ettim ve geçersiz bir cast istisnası
Luke T O'Brien

Beğen! :) Teşekkür ederim!
praguan

Veya: bool newBool ​​= x == true;
Nick Westgate

104

Sen kullanabilirsiniz boş-kaynaştırma operatörü : x ?? something, somethingeğer kullanım istediğiniz bir boole değeri olduğunu xolduğunu null.

Misal:

bool? myBool = null;
bool newBool = myBool ?? false;

newBool yanlış olacak.


1
Yani,bool? myBool = null; bool newBool = myBool ?? false;
CaffGeek

86

Nullable{T} GetValueOrDefault()Yöntemi kullanabilirsiniz . Bu, boşsa yanlış döndürür.

 bool? nullableBool = null;

 bool actualBool = nullableBool.GetValueOrDefault();

6
Bence bu, özlülük ve C # noob dostu olma arasındaki en iyi melez. Ayrıca, varsayılan değeri belirleyebileceğiniz bir aşırı yük olduğunu unutmayın.
Phil

4
Bu yöntemi kullanmayı seviyorum çünkü 'zarif' if ifadeleri oluşturabilirif (nullableBool.GetValueOrDefault())
Luc Wollants

9

Kullanmak gidiyoruz bool?bir in ifaçıklamada, yapmam gereken en kolay şey ya karşı karşılaştırmaktır bulmak trueya 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"; }

Elbette null ile de karşılaştırabilirsiniz.

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.

Uygulamanın diğer bölümlerine geçmek için onu bir bool'a dönüştürecekseniz, o zaman Null Coalesce operatörü istediğiniz şeydir.

bool? b = ...;
bool b2 = b ?? true; // null becomes true
b2 = b ?? false; // null becomes false

Zaten boş değeri işaretlediyseniz ve yalnızca değeri istiyorsanız, Değer özelliğine erişin.

bool? b = ...;
if(b == null)
    throw new ArgumentNullException();
else
    SomeFunc(b.Value);

5

En kolay yol, boş birleştirme operatörünü kullanmaktır: ??

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

}

??Null değerleri ile sağlanan null ifadesini inceleyerek çalışır. Boş değer atanabilir ifade bir değere sahipse, değeri kullanılır, aksi takdirde sağdaki ifadeyi kullanır.??



2

Tam yol şöyle olacaktır:

bool b1;
bool? b2 = ???;
if (b2.HasValue)
   b1 = b2.Value;

Veya kullanarak belirli değerleri test edebilirsiniz

bool b3 = (b2 == true); // b2 is true, not false or null


2

Bu cevap, sadece bool?bir koşulu test etmek istediğiniz zaman kullanım durumu içindir. Normal almak için de kullanılabilir bool. Şahsen okumayı coalescing operator ??.

Bir koşulu test etmek istiyorsanız, bunu kullanabilirsiniz

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

Yukarıdakiler yalnızca bool?doğruysa doğru olacaktır.

Ayrıca düzenli atamak için kullanabilir boola danbool?

bool? nullableBool = someFunction();
bool regularBool = nullableBool == true;

cadı aynıdır

bool? nullableBool = someFunction();
bool regularBool = nullableBool ?? false;

0

Bu, temanın ilginç bir varyasyonudur. İlk ve ikinci bakışta, gerçek dalın alındığını varsayarsınız. Öyle değil!

bool? flag = null;
if (!flag ?? true)
{
    // false branch
}
else
{
    // true branch
}

İstediğinizi elde etmenin yolu şunu yapmaktır:

if (!(flag ?? true))
{
    // false branch
}
else
{
    // true branch
}

-2

System.Convert benim tarafımdan iyi çalışıyor.

using System; ... Bool fixed = Convert.ToBoolean(NullableBool);

Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.