2012-02-01 40 views
23

Tôi đang cố gắng chuyển đổi giá trị bool nullable của tôi và tôi nhận được lỗi này.Không thể chuyển đổi hoàn toàn loại bool?

Cannot implicitly convert type 'bool?' to 'bool'. An explicit conversion exists (are you missing a cast?) 

Ví dụ:

public virtual bool? MyBool 
    { 
    get; 
    set; 
    } 

if (!MyBool){} 
+2

Trong ngắn hạn, các công cụ có thể vô hiệu hóa sẽ gây nhầm lẫn. (chỉ cần nhìn vào SQL) – SLaks

+0

Tôi không nghĩ rằng điều này là quá khó hiểu, nó chỉ là Ternary Logic: http://en.wikipedia.org/wiki/Three-valued_logic - Tôi thực sự thích nó bởi vì tôi thích khái niệm về một cái gì đó không có giá trị. Nói cách khác, uninitialized vs. initialized. – dyslexicanaboko

Trả lời

30

Theo các tiểu bang lỗi, bạn không thể sử dụng một bool? trong một điều kiện. (Điều gì sẽ xảy ra nếu đó là null?)

Thay vào đó, bạn có thể viết if (MyBool != true) hoặc if (MyBool == false), tùy thuộc vào việc bạn muốn bao gồm null. (Và bạn nên thêm một bình luận giải thích đó)

+5

Một kiểm tra hợp lệ khác là 'MyBool ?? false', mặc dù tôi thường thích 'MyBool.GetValueOrDefault()'. –

+0

@AnthonyPegram: Tuy nhiên, yêu cầu thêm dấu ngoặc đơn để phủ định và cũng khó hiểu hơn. – SLaks

+0

Tôi không đồng ý với lần đầu tiên, nhưng tôi không thấy thứ hai khó sử dụng hoặc hiểu hơn. Nói chung, tôi không thích so sánh trực tiếp với đúng hay sai, mặc dù tôi thực hiện chính xác điều đó trong các truy vấn LINQ-to-EF vì phương thức này không được hỗ trợ. –

9

Bạn phải sử dụng MyBool.Value

ví dụ:

Tuy nhiên, bạn nên kiểm tra rằng nó thực sự có giá trị để bắt đầu với . Điều này kiểm tra MyBool có một giá trị và nó là sai.

if (MyBool.HasValue && !MyBool.Value) { } 

Hoặc bạn thực sự có thể muốn điều sau đây chạy khối mã nếu nó chưa được chỉ định hoặc bị sai.

if (!MyBool.HasValue || !MyBool.Value) { } 

Câu hỏi đặt ra thực sự nắm để cho dù bạn thực sự có ý định có một biến boolean nullable và nếu như vậy, làm thế nào bạn muốn xử lý 3 điều kiện có thể xảy ra null, true or false.

2

Bạn cần kiểm tra xem nó có giá trị hay không. Bạn muốn làm gì nếu MyBool == null?

if(MyBool.HasValue && !MyBool.Value) // MyBool is false 
if(MyBool.HasValue && MyBool.Value) // MyBool is true 
if(!MyBool.HasValue) // MyBool is null 
Các vấn đề liên quan