Mengonversi bool nullable? untuk bool


122

Bagaimana Anda mengonversi nullable bool?menjadibool di C #?

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

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;

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.


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

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

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??



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


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;

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
}

-2

System.Convert bekerja dengan baik oleh saya.

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

Dengan menggunakan situs kami, Anda mengakui telah membaca dan memahami Kebijakan Cookie dan Kebijakan Privasi kami.
Licensed under cc by-sa 3.0 with attribution required.