2009-12-13 33 views
34

Sau đây không biên dịch:Kiểm tra đẳng thức với giá trị mặc định

public void MyMethod<T>(T value) 
{ 
    if (value == default(T)) 
    { 
     // do stuff 
    } 
} 

Lỗi: Operator '==' cannot be applied to operands of type 'T' and 'T'

tôi không thể sử dụng value == nullT có thể là một struct.
Tôi không thể sử dụng value.Equals(default(T))value có thể là null. Cách thích hợp để kiểm tra tính bình đẳng với giá trị mặc định là gì?

+2

trả lời nhận xét; và để biết thông tin, 'EqualityComparer 'là việc thực hiện tiêu chuẩn được sử dụng bởi BCL, ví dụ trong' Dictionary <,> '. –

+2

có thể trùng lặp của http://stackoverflow.com/questions/65351/null-or-default-comparsion-of-generic-argument-in-c-sharp – nawfal

Trả lời

53

Để tránh đấm bốc cho struct/Nullable<T>, tôi sẽ sử dụng:

if (EqualityComparer<T>.Default.Equals(value,default(T))) 
{ 
    // do stuff 
} 

này hỗ trợ bất kỳ T mà thực hiện IEquatable<T>, sử dụng object.Equals như một bản sao lưu, và xử lý null vv (và dỡ bỏ các toán tử cho Nullable<T>) một cách tự động.

Ngoài ra còn có Comparer<T>.Default xử lý các kiểm tra so sánh. Điều này xử lý T triển khai IComparable<T>, giảm xuống IComparable - xử lý lại null và các toán tử được nâng lên.

+0

Bạn đang nói rằng 'EqualityComparer .Default.Equals' có hiệu suất tốt hơn' Object.Equals', hoặc nó sẽ cho một giá trị đúng trong một số trường hợp 'Object.Equals' sẽ không? – Greg

+9

Hiệu suất tốt hơn (ít quyền anh); xem xét 'T = int'; để gọi 'object.Equals' nó phải có' value' và 'default (T)' - đó là hai phân bổ heap bổ sung + GC. Sử dụng 'EqualityComparer ' nó có 3 cách triển khai cơ bản khác nhau - 'class',' Nullable 'và' struct' - sau đó nó có thể thực hiện mọi thứ (bao gồm các phép kiểm thử 'null') mà không có ** boxing nào. Công việc tìm hiểu việc triển khai thực hiện nào chỉ được thực hiện một lần cho mỗi loại và được lưu vào bộ nhớ cache, vì vậy vẫn rất nhanh. –

+0

Cảm ơn bạn, Marc! Lời giải thích của bạn thật tuyệt vời – Greg

21

gì về

object.Equals(value, default(T)) 
+0

Tôi biết nó phải đơn giản. Cảm ơn bạn. – Greg

+1

+1. Thử nghiệm. Hoạt động chính xác với nhiều loại khác nhau: 'MyMethod (0); MyMethod (null); MyMethod (null); '- trong mỗi trường hợp trả về true. –

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