Chuyển đổi bool nullable? để bool


122

Làm thế nào để bạn chuyển đổi nullable bool?thành booltrong C #?

Tôi đã thử x.Valuehoặc x.HasValue...

Câu trả lời:


200

Cuối cùng bạn phải quyết định bool null sẽ đại diện cho cái gì. Nếu nullcần false, bạn có thể làm điều này:

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

Hoặc là:

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

Hoặc là:

bool newBool = x ?? false;

Điều gì về trong VB.NETnếu bạn làm dim newBool as Boolean = CBool(x):? Sẽ nullđược chuyển đổi thành falsehoặc sẽ ném một ngoại lệ?
Luke T O'Brien

Điều đó thậm chí còn biên dịch?
Ken Pespisa

Có nó không - Nó được đề xuất trong một 'Hành động nhanh' cho Linqmệnh đề 'Ở đâu', tôi không thể hiểu tại sao lifted operatorsdường như không hoạt động bên trong Linq (có lẽ nó chỉ là VB.NET?) - Tôi vừa thử nghiệm và nó ném một ngoại lệ cast không hợp lệ
Luke T O'Brien

Thích nó! :) Cảm ơn bạn!
praguan

Hoặc: bool newBool ​​= x == true;
Nick Westgate

104

Bạn có thể sử dụng các toán tử null-coalescing : x ?? something, nơi somethinglà một giá trị boolean mà bạn muốn sử dụng nếu xnull.

Thí dụ:

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

newBool sẽ là sai.


1
Vì vậy,bool? myBool = null; bool newBool = myBool ?? false;
CaffGeek

86

Bạn có thể sử dụng Nullable{T} GetValueOrDefault()phương pháp. Điều này sẽ trả về false nếu null.

 bool? nullableBool = null;

 bool actualBool = nullableBool.GetValueOrDefault();

6
Tôi nghĩ rằng đây là sự kết hợp tốt nhất giữa tính hòa đồng và tính thân thiện với C #. Cũng lưu ý rằng có quá tải nơi bạn có thể chỉ định giá trị mặc định.
Phil

4
Tôi như sử dụng phương pháp này, vì nó có thể tạo ra 'tao nhã' nếu phát biểuif (nullableBool.GetValueOrDefault())
Luc Wollants

9

Nếu bạn định sử dụng bool?trong một ifcâu lệnh, tôi thấy điều dễ dàng nhất để làm là so sánh với một trong hai truehoặc 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"; }

Tất nhiên, bạn cũng có thể so sánh với 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.

Nếu bạn định chuyển nó thành bool để chuyển sang các phần khác của ứng dụng, thì toán tử Null Coalesce là thứ bạn muốn.

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

Nếu bạn đã kiểm tra null và bạn chỉ muốn giá trị, thì hãy truy cập thuộc tính Value.

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

5

Cách dễ nhất là sử dụng toán tử liên kết null: ??

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

}

Với ??giá trị nullable hoạt động bằng cách kiểm tra biểu thức nullable đã cung cấp. Nếu biểu thức nullable có một giá trị thì giá trị của nó sẽ được sử dụng, nếu không nó sẽ sử dụng biểu thức ở bên phải của??



2

Cách hoàn chỉnh sẽ là:

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

Hoặc bạn có thể kiểm tra các giá trị cụ thể bằng cách sử dụng

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


2

Câu trả lời này dành cho trường hợp sử dụng khi bạn chỉ muốn kiểm tra bool?trong một điều kiện. Nó cũng có thể được sử dụng để có được một bình thường bool. Nó là một sự thay thế mà tôi phân tích thấy dễ đọc hơn coalescing operator ??.

Nếu bạn muốn kiểm tra một điều kiện, bạn có thể sử dụng

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

Nếu ở trên sẽ chỉ đúng nếu bool?đúng.

Bạn cũng có thể sử dụng điều này để chỉ định một thông thường booltừ mộtbool?

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

phù thủy giống như

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

0

Đây là một biến thể thú vị về chủ đề. Ở cái nhìn đầu tiên và thứ hai, bạn sẽ cho rằng nhánh thật được lấy. Không phải vậy!

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

Cách để đạt được những gì bạn muốn là làm như sau:

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

-2

System.Convert hoạt động tốt bởi tôi.

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

Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.