2013-05-09 43 views
5
bool? ispurchased = null; 
    var pospurcahsed= ispurchased ? "1":"2"; 

Ngoại lệ tạo của nó.Lỗi trình biên dịch cho Nullable Bool

Không thể chuyển đổi hoàn toàn loại 'bool?' để 'bool'. Một chuyển đổi rõ ràng tồn tại (bạn có thiếu một diễn viên không?)

Tôi đang làm gì sai ở đây? cảm ơn sự hỗ trợ và cân nhắc của bạn.

+0

Đó không phải là thông báo lỗi tôi nhận được, tôi nói 'Không thể mặc nhiên chuyển đổi loại 'bool?' để 'bool'. Một chuyển đổi rõ ràng tồn tại (bạn đang thiếu một diễn viên?) 1' –

+0

@George Duckett xin lỗi vì lỗi typo. – Andrew

Trả lời

7

Điều này không được cho phép vì không rõ ý nghĩa của null trong ngữ cảnh có điều kiện.

Nullable Booleans có thể được truyền thành bool một cách rõ ràng để được sử dụng trong điều kiện, nhưng nếu đối tượng có giá trị nếu null, InvalidOperationException sẽ bị ném.

Do đó, điều quan trọng là phải kiểm tra thuộc tính HasValue trước khi truyền tới bool.

Sử dụng như

var pospurcahsed= (ispurchased.HasValue && ispurchased.Value) ?...... 

Nullable Booleans tương tự như các loại biến Boolean được sử dụng trong SQL. Để đảm bảo rằng các kết quả được tạo ra bởi & và | nhà khai thác đang phù hợp với kiểu Boolean ba giá trị của SQL, các nhà khai thác được xác định trước sau được cung cấp:

bool? operator &(bool? x, bool? y) 

bool? operator |(bool? x, bool? y) 

enter image description here

hoặc bạn có thể sử dụng martin gợi ý GetValueOrDefault [Nhờ martin để trỏ nó ra]

Phương thức GetValueOrDefault trả về một giá trị ngay cả khi thuộc tính HasValue là sai (không giống như thuộc tính Giá trị, mà ném một ngoại lệ).

+1

'ispurchased.HasValue && ispurchased.Value' có thể được viết lại thành' ispurchased == true', IMO dễ đọc hơn. – hvd

+1

Hoặc dưới dạng 'ispurchased.GetValueOrDefault()' –

+0

@Martin tôi đã chỉnh sửa câu trả lời của tôi. – joshua

2

Vấn đề bạn có là toán tử điều kiện ? : mong đợi một bool, không phải là bool?. Bạn chỉ có thể bỏ nó và được thực hiện, nhưng bạn sẽ nhận được một InvalidOperationException nếu giá trị chứa null, vì vậy bạn có lẽ nên kiểm tra điều đó trước tiên.

Đặt tên biến của bạn, tôi đã tiếp tục và giả sử bạn muốn xử lý null như bạn sẽ false, vì vậy trong mã bên dưới tôi kiểm tra để đảm bảo nó có giá trị và nếu có nó sẽ sử dụng nó trong điều kiện. Trong trường hợp nó không có một giá trị (tức là nó là null sau đó các diễn viên sẽ không bao giờ xảy ra và bạn sẽ không nhận được lỗi (biểu thức sẽ đánh giá false).

bool? ispurchased = null; 
var pospurcahsed = (ispurchased.HasValue && (bool)ispurchased) ? "1":"2"; 
2

Bạn không thể sử dụng Nullable<bool> hoặc bool? trong tình trạng trực tiếp, thay vì sử dụng nó như:

var pospurcahsed= (ispurchased.HasValue && ispurchased.Value) ? "1":"2"; 
2

Bạn nên sử dụng .giá trị

bool? ispurchased = null; 

if (ispurchased.HasValue) 
{ 
    var pospurcahsed = ispurchased.Value ? "1" : "2"; 
} 
0

Bạn có thể sử dụng một cái gì đó như thế này

bool? chk = false; 

//or 

bool? chk2 = false; 

var test = (chk != null && (bool)chk) ? "1": "2"; 

//or 

var test2 = (chk2.HasValue && (bool)chk2) ? "1" : "2"; 

tôi sẽ đề nghị không sử dụng var từ khóa với nhiều loại biết đến.

Thay vì sử dụng này Như thế này:

String test = (chk != null && (bool)chk) ? "1" : "2"; 
Các vấn đề liên quan