2009-03-15 26 views
47

Tôi có tham số 'tùy chọn' trên phương thức là KeyValuePair. Tôi muốn một tình trạng quá tải mà đi null để phương pháp cốt lõi cho tham số này, nhưng trong phương pháp cốt lõi, khi tôi muốn kiểm tra xem KeyValuePair là null, tôi nhận được lỗi sau:Làm thế nào để đối tượng không được so sánh với null?

Operator '!=' cannot be applied to operands of type System.Collections.Generic.KeyValuePair<string,object>' and '<null>. 

Làm thế nào tôi có thể không được được phép kiểm tra nếu một đối tượng là null?

+0

Bạn có thể cung cấp mẫu mã cho biết lỗi này không? –

+2

Xem thêm: http://stackoverflow.com/questions/1335419/how-can-i-make-sure-that-firstordefaultkeyvaluepair-has-returned-a-value –

Trả lời

78

KeyValuePair<K,V> là cấu trúc chứ không phải lớp. Nó giống như thực hiện:

int i = 10; 
if (i != null) ... 

(Mặc dù đó là thực sự hợp pháp, với một cảnh báo, do quy tắc chuyển đổi nullable lẻ Bit quan trọng là điều kiện if sẽ không bao giờ thành sự thật..)

Để làm cho nó "tùy chọn", bạn có thể sử dụng biểu mẫu có thể hủy:

static void Foo(KeyValuePair<object,string>? pair) 
{ 
    if (pair != null) 
    { 
    } 
    // Other code 
} 

Lưu ý? trong KeyValuePair<object,string>?

+1

Cảm ơn, đừng bao giờ nghĩ rằng đó là cấu trúc. Duh! – ProfK

+4

"(i! = Null)" không tạo ra cảnh báo, nhưng thật đáng buồn là không có cảnh báo nào cho kiểu giá trị do người dùng định nghĩa quá tải Equals/== /! = Theo hướng dẫn MSDN. Rất khó hiểu khi tôi thực hiện "struct Foo" và khách hàng của tôi hy vọng "if (someFoo! = Null)" là một cách hợp lý để kiểm tra xem someFoo có một giá trị hay không. :-p – yoyo

7

Vì KeyValuePair là cấu trúc (một loại giá trị), bạn chỉ có thể so sánh giá trị rỗng trên các loại tham chiếu.

Tôi đoán bạn chưa viết thêm quá tải. Nó sẽ thất bại khi bạn cố gắng vượt qua null như giá trị của một KeyValuePair.

3

KeyValuePair < K, V > là cấu trúc và do đó không thể rỗng trong bất kỳ trường hợp nào. Chỉ một kiểu tham chiếu có thể là null.

Nếu bạn đang cố gắng nắm bắt giá trị không chính xác, bạn sẽ phải xác thực riêng từng thành viên Chính và Giá trị.

-8

Bạn thực sự có thể sử dụng KeyValuePair.IsNull() để xác định xem KeyValuePair đã được đặt chưa.

+0

Bạn lấy KeyValuePair.IsNull() ở đâu? Một phương pháp mở rộng? – Mark

12

tôi trả lời này mặc dù tuổi của nó bởi vì nó là một trong 1 Google kết quả cho "thử nghiệm KeyValuePair null"

Câu trả lời chỉ định là đúng, nhưng nó không hoàn toàn trả lời những vấn đề, ít nhất là một trong những Tôi đã có, nơi tôi cần phải kiểm tra sự tồn tại của KeyValuePair và chuyển sang một kiểm tra khác của Dictionary nếu nó không tồn tại theo cách tôi mong đợi.

Sử dụng phương pháp trên không hiệu quả đối với tôi vì trình biên dịch bị tắt khi nhận KeyValuePair.Value của KeyValuePair<>?, vì vậy tốt hơn nên sử dụng default(KeyValuePair<>) như đã thấy trong câu hỏi + câu trả lời này. The default for KeyValuePair

Các vấn đề liên quan