2015-05-13 22 views
8

Trong đoạn mã C# sau, tôi ghi đè phương thức ==. _type là một số loại short. Vì vậy, tôi thực sự nói rằng hai số WorkUnitType s giống nhau khi hai số này short s giống nhau.Kiểm tra ghi đè rỗng trong ==

public static bool operator ==(WorkUnitType type1, WorkUnitType type2) 
{ 
    if (type1 == null || type2 == null) 
     return false; 
    return type1._type == type2._type; 
} 

Bởi vì R # cảnh báo tôi, và nó là hoàn toàn rõ ràng lý do tại sao, mà type1/type2 khả năng có thể được null Tôi đang cố gắng để bắt rằng với if tuyên bố trên.

Bây giờ tôi đang nhận được StackOverflowException, điều này hoàn toàn có ý nghĩa bởi vì tôi thực sự đang gọi ghi đè.

Câu hỏi: Làm cách nào để viết phương pháp này "chính xác". Làm thế nào tôi có thể bắt được trường hợp type1 hoặc type2 có thể là null?

đoán tốt nhất của tôi: Có lẽ tôi chỉ lợi dụng == đây và kiểm tra bình đẳng nên được thực hiện với sự Equals ghi đè. Nhưng tôi vẫn nghĩ vấn đề tồn tại. Vì vậy, lỗi của tôi trong lý luận là ở đâu?

Trả lời

9

Bạn đang tìm kiếm hàm ReferenceEquals(), sẽ so sánh trực tiếp, bỏ qua quá tải của nhà điều hành.

+0

Tôi không biết rằng 'ReferenceEquals' tồn tại. Đây thực sự là câu trả lời. Cảm ơn. – Stephan

2

Ngoài những gì SLaks đã nói, bạn có thể cũng muốn trả về true nếu cả hai đều bằng null. Vì vậy, như thế này:

public static bool operator ==(WorkUnitType type1, WorkUnitType type2) 
{ 
    if (ReferenceEquals(type1, null)) 
     return ReferenceEquals(type2, null); 

    if (ReferenceEquals(type2, null)) 
     return false; 

    return type1._type == type2._type; 
} 
1

Đối với đầy đủ lợi ích: bạn cũng có thể đúc hai đối số cho object. Điều này sẽ sử dụng việc triển khai như được định nghĩa trong object chứ không phải tùy chỉnh của bạn.

Trong mã:

if ((object) type1 == null || (object) type2 == null) 
Các vấn đề liên quan