แปลงบูลที่เป็นโมฆะ? เพื่อบูล


122

คุณแปลง nullable bool?เป็นboolC # ได้อย่างไร

ฉันได้ลองx.Valueหรือx.HasValue...

คำตอบ:


201

ในที่สุดคุณต้องตัดสินใจว่าบูลว่างจะเป็นตัวแทนของอะไร หากnullควรจะเป็นfalseคุณสามารถทำได้:

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

หรือ:

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

หรือ:

bool newBool = x ?? false;

แล้วVB.NETถ้าคุณทำ: dim newBool as Boolean = CBool(x)? จะnullถูกแปลงเป็นfalseหรือจะโยนข้อยกเว้น?
Luke T O'Brien

มันยังรวบรวม?
Ken Pespisa

ใช่ - แนะนำใน 'Quick Action' สำหรับLinqคำสั่ง 'Where' ฉันไม่เข้าใจว่าทำไมlifted operatorsดูเหมือนจะไม่ทำงานใน Linq (อาจเป็นแค่ VB.NET?) - ฉันเพิ่งทดสอบและ มันทำให้เกิดข้อยกเว้นการร่ายที่ไม่ถูกต้อง
Luke T O'Brien

ชอบมัน! :) ขอบคุณ!
praguan

หรือ: bool newBool ​​= x == true;
Nick Westgate

104

คุณสามารถใช้ประกอบการด้วย null coalescing : x ?? somethingซึ่งsomethingเป็นค่าบูลีนที่คุณต้องการที่จะใช้ถ้าเป็นxnull

ตัวอย่าง:

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

newBool จะเป็นเท็จ


1
ดังนั้นbool? myBool = null; bool newBool = myBool ?? false;
CaffGeek

86

คุณสามารถใช้Nullable{T} GetValueOrDefault()วิธีการ สิ่งนี้จะส่งคืนเท็จหากเป็นโมฆะ

 bool? nullableBool = null;

 bool actualBool = nullableBool.GetValueOrDefault();

6
ฉันคิดว่านี่เป็นลูกผสมที่ดีที่สุดระหว่างความกระชับและความเป็นมิตรกับ C # noob โปรดทราบว่ามีการโอเวอร์โหลดที่คุณสามารถระบุค่าเริ่มต้นได้
ฟิลิป

4
ฉันชอบใช้วิธีนี้เพราะสามารถสร้าง if statement ที่ 'สง่างาม' ได้if (nullableBool.GetValueOrDefault())
Luc Wollants

9

หากคุณกำลังจะใช้bool?ในifคำสั่งผมพบสิ่งที่ง่ายที่สุดที่จะทำคือการเปรียบเทียบกับอย่างใดอย่างหนึ่งหรือtruefalse

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"; }

แน่นอนคุณสามารถเปรียบเทียบกับค่าว่างได้เช่นกัน

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.

หากคุณจะแปลงเป็นบูลเพื่อส่งต่อไปยังส่วนอื่น ๆ ของแอปพลิเคชันตัวดำเนินการ Null Coalesce คือสิ่งที่คุณต้องการ

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

หากคุณได้ตรวจสอบค่าว่างแล้วและคุณต้องการเพียงแค่ค่านั้นให้เข้าไปที่คุณสมบัติ Value

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

5

วิธีที่ง่ายที่สุดคือใช้ตัวดำเนินการเชื่อมต่อแบบ null: ??

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

}

ที่??มีค่า nullable ทำงานโดยการตรวจสอบนิพจน์ที่เป็นโมฆะที่ระบุ หากนิพจน์ที่เป็นโมฆะมีค่าจะใช้ค่าของมันมิฉะนั้นจะใช้นิพจน์ทางด้านขวาของ??



2

วิธีที่สมบูรณ์คือ:

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

หรือคุณสามารถทดสอบค่าเฉพาะโดยใช้

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


2

คำตอบนี้มีไว้สำหรับกรณีการใช้งานเมื่อคุณต้องการทดสอบbool?เงื่อนไข boolนอกจากนี้ยังสามารถนำมาใช้เพื่อให้ได้ตามปกติ เป็นอีกทางเลือกหนึ่งที่ฉันหาอ่านได้ง่ายกว่าไฟล์coalescing operator ??.

หากคุณต้องการทดสอบเงื่อนไขคุณสามารถใช้สิ่งนี้ได้

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

ข้างต้นถ้าจะเป็นจริงก็ต่อเมื่อไฟล์ bool?เป็นจริง

คุณยังสามารถใช้สิ่งนี้เพื่อกำหนดค่าปกติboolจากไฟล์bool?

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

แม่มดก็เช่นเดียวกับ

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

0

นี่เป็นรูปแบบที่น่าสนใจในธีม ในการมองครั้งแรกและครั้งที่สองคุณจะถือว่าสาขาที่แท้จริงถูกยึด ไม่อย่างนั้น!

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

วิธีที่จะได้รับสิ่งที่คุณต้องการคือทำสิ่งนี้:

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

โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.