Mengonversi bool nullable? untuk bool

122

Bagaimana Anda mengonversi nullable bool?menjadibool di C #?

Saya telah mencoba x.Valueatau x.HasValue...

KentZhou
sumber

Jawaban:

200

Anda pada akhirnya harus memutuskan apa yang akan diwakili oleh null bool. Jika nullseharusnya false, Anda dapat melakukan ini:

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

Atau:

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

Atau:

bool newBool = x ?? false;
Ken Pespisa
sumber
Bagaimana VB.NETjika Anda melakukan dim newBool as Boolean = CBool(x):? Akan nulldikonversi falseatau akankah pengecualian dilemparkan?
Luke T O'Brien
Apakah itu bisa dikompilasi?
Ken Pespisa
Ya benar - Ini disarankan dalam 'Tindakan Cepat' untuk Linqpernyataan klausa 'Di mana', saya tidak mengerti mengapa lifted operatorstampaknya tidak berfungsi di dalam Linq (mungkin hanya VB.NET?) - Saya baru saja menguji dan itu tidak melempar pengecualian pemain yang tidak valid
Luke T O'Brien
Suka itu! :) Terima kasih!
praguan
Atau: bool newBool ​​= x == true;
Nick Westgate
104

Anda dapat menggunakan null-penggabungan Operator : x ?? something, di mana somethingadalah nilai boolean yang ingin Anda gunakan jika xini null.

Contoh:

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

newBool akan salah.

SLaks
sumber
1
Jadi,bool? myBool = null; bool newBool = myBool ?? false;
CaffGeek
86

Anda bisa menggunakan Nullable{T} GetValueOrDefault()metode. Ini akan mengembalikan nilai salah jika nol.

 bool? nullableBool = null;

 bool actualBool = nullableBool.GetValueOrDefault();
Joel Briggs
sumber
6
Saya pikir ini adalah hibrida terbaik antara keringkasan dan keramahan C # noob. Perhatikan juga bahwa ada kelebihan beban di mana Anda dapat menentukan nilai default.
Phil
4
Saya suka menggunakan metode ini, karena dapat membuat pernyataan if 'elegan'if (nullableBool.GetValueOrDefault())
Luc Wollants
9

Jika Anda akan menggunakan bool?in sebuah ifpernyataan, menurut saya hal termudah untuk dilakukan adalah membandingkannya dengan trueatau 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"; }

Tentu saja, Anda juga bisa membandingkan dengan 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.

Jika Anda akan mengubahnya menjadi bool untuk diteruskan ke bagian lain dari aplikasi, maka operator Null Coalesce adalah yang Anda inginkan.

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

Jika Anda sudah memeriksa null, dan Anda hanya menginginkan nilainya, akses properti Value.

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

Cara termudah adalah dengan menggunakan operator penggabungan nol: ??

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

}

The ??with nullable values ​​bekerja dengan memeriksa ekspresi nullable yang disediakan. Jika ekspresi nullable memiliki nilai, nilainya akan digunakan jika tidak akan menggunakan ekspresi di sebelah kanan??

JaredPar
sumber
3
bool? a = null;
bool b = Convert.toBoolean(a); 
patrick
sumber
2

Cara lengkapnya adalah:

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

Atau Anda dapat menguji nilai tertentu menggunakan

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

Sesuatu seperti:

if (bn.HasValue)
{
  b = bn.Value
}
manojlds
sumber
2

Jawaban ini untuk kasus penggunaan saat Anda hanya ingin menguji bool?dalam kondisi. Itu juga bisa digunakan untuk menjadi normal bool. Ini adalah alternatif yang menurut saya lebih mudah dibaca daripada coalescing operator ??.

Jika Anda ingin menguji suatu kondisi, Anda dapat menggunakan ini

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

Di atas jika akan benar hanya jika bool?benar.

Anda juga dapat menggunakan ini untuk menetapkan reguler booldari abool?

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

penyihir sama dengan

bool? nullableBool = someFunction();
bool regularBool = nullableBool ?? false;
Rémi
sumber
0

Ini adalah variasi tema yang menarik. Pada pandangan pertama dan kedua Anda akan berasumsi bahwa cabang yang sebenarnya telah diambil. Tidak begitu!

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

Cara mendapatkan apa yang Anda inginkan adalah dengan melakukan ini:

if (!(flag ?? true))
{
    // false branch
}
else
{
    // true branch
}
stevieg.dll
sumber
-2

System.Convert bekerja dengan baik oleh saya.

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

lemi yang mengejutkan
sumber