2015-04-23 13 views
6

है यहाँ कुछ उदाहरण कोड है:क्यों यह एक वैध तुलना

static DateTime time; 
if (time == null) 
{ 
/* do something */ 
} 

DateTime के बाद से खाली नहीं रह सकती, क्यों इस कोड को संकलित करता है?

संपादित करें: मुद्दा नहीं सिर्फ इतना है कि इस कोड को हमेशा अवास्तविक लौटाते हैं है, लेकिन क्यों DateTime की तरह कुछ जो है अशक्त इस तरह के एक तुलना में अनुमति दी है कभी नहीं।

+4

मेरा मानना ​​है कि ऐसा इसलिए है क्योंकि 'डेटटाइम' से 'डेटटाइम' तक कोई अंतर्निहित रूपांतरण है। हालांकि, यह रूपांतरण लगातार जांच नहीं किया जाता है ... –

+0

(या कम से कम लगातार जांच नहीं की गई थी ... मुझे यकीन है कि इसके आसपास कुछ विषमताएं होती हैं, लेकिन मैं उन्हें रोज़लिन के साथ पुन: उत्पन्न नहीं कर सकता।) –

उत्तर

6

हालांकि time एक गैर-शून्य मूल्य प्रकार का है, इसे शून्य में परिवर्तित किया जा सकता है और null की तुलना में परिवर्तित किया जा सकता है। तुलना false उत्पन्न करेगी, जो एक वैध परिणाम है।

इसका मतलब यह नहीं है कि यह एक अच्छा कोड है। उपकरण, जैसे कि रे: तेज, इस पंक्ति को चेतावनी के साथ ध्वजांकित करेगा कि "अभिव्यक्ति हमेशा झूठी है"।

+2

Roslyn भी करता है :) –

+1

विजुअल स्टूडियो 2013 कुछ के लिए एक चेतावनी प्रदर्शित करता है, लेकिन सभी मूल्य प्रकार नहीं। उदाहरण के लिए, यदि आपने 'डेटटाइम' के बजाय 'int' का उपयोग किया था, तो आपको एक हरा स्क्विगली लाइन (चेतावनी) मिल जाएगी "अभिव्यक्ति हमेशा झूठी होती है"; 'डेटटाइम' के साथ आपको ऐसी चेतावनी नहीं मिलती है। – stakx

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