2015-02-11 10 views
11

मैं इस चेतावनी हो रही है, लेकिन समस्या को समझ नहीं सकता ...कोडकंट्रैक्ट्स: बूलियन की स्थिति निरंतर मूल्य का मूल्यांकन करती है, क्यों?

CodeContracts: चेतावनी: बूलियन हालत d1.Count = d2.Count हमेशा एक निरंतर मूल्य के लिए मूल्यांकन करता है। यदि यह (या उसका निषेध) स्रोत कोड में दिखाई देते हैं, तो आप कुछ मृत कोड या निरर्थक जाँच हो सकता है

कोड इस प्रकार है: के रूप में

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; 
} 

// Equality check goes here हिस्सा हो सकता है , या a proper implementation द्वारा प्रतिस्थापित किया गया है और मुझे अभी भी वही चेतावनी मिलती है।

+0

लगता है कि '(डी 1 == डी 2)' को ऑब्जेक्ट में बदला जाना चाहिए। संदर्भ इक्वल्स (डी 1, डी 2) ' –

+0

@DmitryBychenko वही काम करता है। 'IDictionary ' के लिए कोई ओवरलोडेड ऑपरेटर नहीं है। – hvd

+0

@hvd आप इंटरफेस –

उत्तर

5

यह कोड अनुबंधों में बस एक बग है। इनपुट को concoct करना आसान है जो इस स्थिति को सच या गलत बनाता है। चेतावनी फर्जी है।

व्यक्तिगत अनुभव से मुझे पता है कि सीसी में कीड़े दुर्लभ नहीं हैं।

कैसे ठीक करें? चूंकि यह एक बग है क्योंकि कार्रवाई का कोई आधिकारिक/इच्छित पाठ्यक्रम नहीं है। बग की रिपोर्ट करें। चेतावनी दूर होने तक कोड को चारों ओर घुमाएं (उदाहरण के लिए, ReferenceEquals आज़माएं जो कि वैसे भी बेहतर शैली है)। चेतावनी दबाओ। इस तरह बातें।

+0

क्या यह ज्ञात बग है या आप अनुमान लगा रहे हैं? क्या आप आधिकारिक बग रिपोर्ट से लिंक कर सकते हैं? – Keith

+1

@ किथ यह कैसे एक बग नहीं हो सकता है? उस चेतावनी में बयान स्पष्ट रूप से झूठा है। – usr

+0

मुझे अभी तक विश्वास नहीं है कि यह एक बग है। उपरोक्त ओपी को मेरी टिप्पणी देखें। कॉलिंग कोड इस तरह से लिखा जा सकता है कि यह सुनिश्चित करता है कि स्थिति हमेशा गलत है। – Keith

संबंधित मुद्दे