2010-02-03 12 views
18

निम्न कोड पर विचार करें:Nullable <T> HasValue प्रॉपर्टी Nulls पर NullReferenceException क्यों नहीं फेंकती है?

DateTime? ndate = null; 
Console.WriteLine(ndate.HasValue); 

मुझे एक NullReferenceException की उम्मीद होगी, लेकिन HasValue वास्तव में झूठी वापसी होगी। हालांकि, चूंकि एनएंडेट शून्य है, संपत्ति आवेदक कैसे सफल होता है, क्योंकि संपत्ति हैस्वालू को आमंत्रित करने के लिए कोई वस्तु नहीं है?

उत्तर

39

तकनीकी रूप से, "ndate" शून्य नहीं है - यह एक मान प्रकार है, इसके मूल्य को शून्य के रूप में निर्दिष्ट किया गया है।

जब आप DateTime? लिखते हैं, तो यह Nullable<DateTime> के लिए सिर्फ लघुरूप है, जो एक संरचना है। तकनीकी रूप से शून्य होने के लिए इसका कोई तरीका नहीं है, क्योंकि यह संदर्भ प्रकार नहीं है।

+0

+1 सर्वोत्तम स्पष्टीकरण। – JonH

+1

मुझे लगता है कि (ndate == null) एक ओवरलोडेड ऑपरेटर के माध्यम से काम करता है? – Nathan

+0

@ नाथन सच 15 वर्ण – JonH

-4

Synctactic चीनी मेरे दोस्त ... संकलक कोड में .HasValue कॉल कि :-)

+0

वास्तव में सच नहीं है - ndate चर तकनीकी रूप से कभी भी "शून्य" नहीं है क्योंकि यह एक मान प्रकार है, और शून्य नहीं हो सकता है। इसमें शून्य का मूल्य है, जो बहुत अलग है। –

+0

असल में, कंपाइलर 'ndate = null' को' ndate = new nullable () ' – Greg

2

एक अपवाद फेंक नहीं होगा क्या वास्तव में ऐसा होता है कि एक वास्तविक (गैर नल) Nullable संरचना सौंप दिया जाता है है कि बदल जाता है चर के लिए, इस प्रकार परिवर्तनीय शून्य नहीं है लेकिन यह मान है।

+0

में बदलता है ... वास्तव में, यहां तक ​​कि इसका * मान * शून्य नहीं है, क्योंकि' Nullable 'में 'टी है: संरचना 'बाधा, सही? मुझे लगता है कि यह अंदर सिर्फ एक झंडा है। –

7

Nullable<T> एक संरचना है, मूल रूप से यह null मान नहीं रख सकता है।

Nullable<DateTime> ndate = new Nullable<DateTime>(); 

एक अन्य उदाहरण है, अभिव्यक्ति:

आपके असाइनमेंट, वास्तव में कुछ है कि इस तरह दिखता है में संकलित किया गया है

int? a = null; 

तैयार करेगा निम्नलिखित आईएल:

.locals init (valuetype [mscorlib]System.Nullable`1<int32> V_0) 
IL_0000: ldloca.s V_0 
IL_0002: initobj valuetype [mscorlib]System.Nullable`1<int32> 

initobj ऑपरेशन के लिए एक कॉल, जो एवी के प्रत्येक क्षेत्र को आरंभ करता है एक निर्दिष्ट पते पर एक शून्य संदर्भ या उपयुक्त आदिम प्रकार के 0 के लिए अल्यू प्रकार।

निष्कर्ष में, यहां क्या हो रहा है डिफ़ॉल्ट struct initialization है।

6

मैं एक NullReferenceException

कोई अशक्त संदर्भ dereferenced किया जा रहा है, तो "NullReferenceException" की उम्मीद नहीं की जानी चाहिए नहीं है उम्मीद है। शून्य दिनांक दिनांक शून्य संदर्भ नहीं है। यह शून्य मान है।

हालांकि, बाद से ndate रिक्त है, कैसे संपत्ति मंगलाचरण सफल होने करता है, के बाद से वहाँ पर संपत्ति HasValue आह्वान करने के लिए कोई वस्तु है?

प्रश्न एक झूठी आधार का अनुमान लगाता है। एक वस्तु है एक निरर्थक डेटटाइम एक निरर्थक डेटटाइम के शून्य मान का प्रतिनिधित्व करता है। वह मान एक वस्तु है।

DateTime ndate = default(DateTime); 
bool ndateHasValue = false; 
Console.WriteLine(ndateHasValue); 

एक नल मान प्रकार बस एक सुखद रास्ते कोड है कि इसका मतलब है लिखने के लिए:

DateTime? ndate = null; 
Console.WriteLine(ndate.HasValue); 

यह सिर्फ कुछ है कि तार्किक तरह है लेखन की एक छोटी तरीका है:

अपने कोड पर विचार करें "कृपया इस बात पर एक बूलियन संलग्न करें जो ट्रैक करता है कि यह तर्कसंगत रूप से शून्य है या नहीं"।

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