निम्नलिखित कोड पर विचार करें:गलत संकलक चेतावनी तुलना करते समय struct शून्य पर
DateTime t = DateTime.Today;
bool isGreater = t > null;
दृश्य स्टूडियो 2010 (सी # 4, .NET 4.0) के साथ, मैं निम्न चेतावनी मिलती है:
चेतावनी CS0458 : अभिव्यक्ति का परिणाम हमेशा 'बूल' प्रकार का 'शून्य' होता है?
यह गलत है;
अब, struct दिनांक समय overloads >
(से अधिक) ऑपरेटर: परिणाम हमेशा false
(प्रकार bool
की) है। कोई भी गैर-शून्य संरचना (जैसे डेटटाइम) संबंधित Nullable<>
प्रकार के लिए पूरी तरह से परिवर्तनीय है। उपर्युक्त अभिव्यक्ति
bool isGreater = (DateTime?)t > (DateTime?)null;
के बराबर बराबर है जो एक ही गलत चेतावनी उत्पन्न करती है। यहां >
ऑपरेटर ऑपरेटर उठाया गया है। यह झूठी लौटकर काम करता है अगर उसके दो ऑपरेटरों में से HasValue
false
है। अन्यथा, उठाया ऑपरेटर अंतर्निहित संरचना में दो ऑपरेटरों को खोलने के लिए आगे बढ़ेगा, और फिर उस संरचना द्वारा परिभाषित >
के ओवरलोड को कॉल करें (लेकिन इस मामले में यह आवश्यक नहीं है जहां एक ऑपरेंड HasValue
नहीं है)।
क्या आप इस बग को पुन: पेश कर सकते हैं, और क्या यह बग अच्छी तरह से ज्ञात है? क्या मैंने कुछ गलत समझा है?
यह सभी संरचना प्रकारों के लिए समान है (int
जैसे सरल प्रकार नहीं, और enum प्रकार नहीं) जो ऑपरेटर को प्रश्न में अधिभारित करते हैं।
(अब मैं अगर हम >
के बजाय ==
उपयोग करते हैं, सब कुछ पूरी तरह से समान होने के लिए (क्योंकि दिनांक समय भी ==
ऑपरेटर) overloads। लेकिन यह समान नहीं है चाहिए। अगर मैं कहता हूँ
DateTime t = DateTime.Today;
bool isEqual = t == null;
मिल कोई चेतावनी ☹ कभी-कभी आप लोगों को गलती से एक चर या पैरामीटर की जांच करते हैं, यह महसूस नहीं करते कि उनके चर का प्रकार एक संरचना है (जो ==
ओवरलोड करता है और यह int
जैसे साधारण प्रकार का नहीं है)। अगर उन्हें चेतावनी मिलती तो बेहतर होगा ।)
अद्यतन: विजुअल स्टूडियो 2015 के सी # 6.0 संकलक (Roslyn के आधार पर) के साथ, isGreater
साथ गलत संदेश के ऊपर एक सही और उपयोगी चेतावनी संदेश के साथ एक CS0464 में बदल जाता है। इसके अलावा, ऊपर isEqual
के साथ चेतावनी की कमी VS2015 के कंपाइलर में तय की गई है, लेकिन केवल तभी जब आप /features:strict
के साथ संकलित हों।
'[कुछ भी]> नल 'से शुरू करने के लिए कोई समझ नहीं आता है (मेरे लिए, कम से कम)। दिलचस्प सवाल फिर भी, मुझे लगता है कि इसे 'झूठी' के रूप में हमेशा 'झूठी' के रूप में समाप्त होने के बारे में चेतावनी दी जानी चाहिए। – Alex
उपयोगी हो सकता है: http://blogs.msdn.com/b/abhinaba/archive/2005/12/11/501544.aspx और http://blogs.msdn.com/b/abhinaba/archive/2005/12 /14/503533.aspx – Habib
दिलचस्प बात यह है कि 'dateTime.CompareTo (ऑब्जेक्ट) '_pepecifically_'' n' 'की तुलना करते समय' null' 'की तुलना करता है, जो भी ऑब्जेक्ट प्रकार गुजरता है। – Rawling