2015-02-11 21 views
11

Tôi nhận được cảnh báo này nhưng không thể tìm ra vấn đề ...CodeContracts: Điều kiện Boolean đánh giá thành một giá trị không đổi, tại sao?

CodeContracts: cảnh báo: Tình trạng Boolean d1.Count = d2.Count luôn đánh giá một giá trị không đổi. Nếu nó (hoặc phủ định của nó) xuất hiện trong mã nguồn, bạn có thể có một số mã đã chết hoặc thừa séc

Mã này được như sau:

public static bool DictionaryEquals<TKey, TValue>(IDictionary<TKey, TValue> d1, IDictionary<TKey, TValue> d2) 
{ 
    if (d1 == d2) return true; 
    if (d1 == null || d2 == null) return false; 
    if (d1.Count != d2.Count) return false; // <-- warning here 

    // Equality check goes here 

    return true; 
} 

Phần // Equality check goes here có thể như là hoặc thay thế bằng a proper implementation và tôi vẫn nhận được cảnh báo tương tự.

+0

Dường như '(d1 == d2)' nên được thay đổi thành 'Object.ReferenceEquals (d1, d2)' –

+0

@DmitryBychenko Điều tương tự. Không có toán tử quá tải cho 'IDictionary '. – hvd

+0

@hvd Bạn không thể cung cấp tình trạng quá tải cho các giao diện –

Trả lời

5

Đây đơn giản là lỗi trong Hợp đồng mã. Nó rất dễ dàng để pha trộn đầu vào mà làm cho điều kiện này đúng hay sai. Cảnh báo là không có thật.

Từ kinh nghiệm cá nhân tôi biết rằng các lỗi trong CC không phải là hiếm.

Cách khắc phục? Vì đây là lỗi nên không có khóa học hành động chính thức/dự định. Báo cáo lỗi. Chuyển mã xung quanh cho đến khi cảnh báo biến mất (ví dụ: hãy thử ReferenceEquals là kiểu tốt hơn). Ngăn chặn cảnh báo. Những thứ như thế.

+0

Đây có phải là lỗi đã biết hoặc bạn đang suy đoán không? Bạn có thể liên kết đến một báo cáo lỗi chính thức không? – Keith

+1

@Bằng cách nào nó không phải là lỗi? Tuyên bố được đưa ra trong cảnh báo đó rõ ràng là sai. – usr

+0

Tôi chưa tin rằng đó là lỗi. Xem bình luận của tôi cho OP ở trên. Mã gọi có thể được viết theo cách đảm bảo điều kiện luôn sai. – Keith

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