मैंने एक अशक्त इंट को मान प्रदान करने के लिए विभिन्न तरीकों का उपयोग करके इस पर कुछ शोध किया। यहाँ है, जब मैंने विभिन्न चीजें कीं। स्पष्ट करना चाहिए कि क्या चल रहा है। ध्यान रखें: Nullable<something>या शॉर्टहैंड something?एक संरचना है जिसके लिए कंपाइलर हमें शून्य के साथ उपयोग करने के लिए बहुत काम कर रहा है जैसे कि यह एक वर्ग था।
जैसा कि आप नीचे देखेंगे, SomeNullable == nullऔर SomeNullable.HasValueहमेशा एक सही या गलत वापसी करेंगे। हालांकि नीचे प्रदर्शित नहीं किया गया है, SomeNullable == 3यह भी मान्य है (कुछ को मानना संभव है int?)।
जबकि SomeNullable.Valueहमें एक रनटाइम त्रुटि मिलती है यदि हम को सौंपा गया nullहै SomeNullable। यह वास्तव में एकमात्र मामला है जहां नलबल हमें एक समस्या पैदा कर सकता है, अतिभारित ऑपरेटरों के संयोजन के कारण, अतिभारितobject.Equals(obj) विधि, और संकलक अनुकूलन और बंदर व्यवसाय।
यहाँ कुछ कोड का विवरण दिया गया है जो मैं चला रहा था, और यह लेबल में किस आउटपुट का उत्पादन करता है:
int? val = null;
lbl_Val.Text = val.ToString(); //Produced an empty string.
lbl_ValVal.Text = val.Value.ToString(); //Produced a runtime error. ("Nullable object must have a value.")
lbl_ValEqNull.Text = (val == null).ToString(); //Produced "True" (without the quotes)
lbl_ValNEqNull.Text = (val != null).ToString(); //Produced "False"
lbl_ValHasVal.Text = val.HasValue.ToString(); //Produced "False"
lbl_NValHasVal.Text = (!(val.HasValue)).ToString(); //Produced "True"
lbl_ValValEqNull.Text = (val.Value == null).ToString(); //Produced a runtime error. ("Nullable object must have a value.")
lbl_ValValNEqNull.Text = (val.Value != null).ToString(); //Produced a runtime error. ("Nullable object must have a value.")
ठीक है, अगले आरंभीकरण विधि का प्रयास करें:
int? val = new int?();
lbl_Val.Text = val.ToString(); //Produced an empty string.
lbl_ValVal.Text = val.Value.ToString(); //Produced a runtime error. ("Nullable object must have a value.")
lbl_ValEqNull.Text = (val == null).ToString(); //Produced "True" (without the quotes)
lbl_ValNEqNull.Text = (val != null).ToString(); //Produced "False"
lbl_ValHasVal.Text = val.HasValue.ToString(); //Produced "False"
lbl_NValHasVal.Text = (!(val.HasValue)).ToString(); //Produced "True"
lbl_ValValEqNull.Text = (val.Value == null).ToString(); //Produced a runtime error. ("Nullable object must have a value.")
lbl_ValValNEqNull.Text = (val.Value != null).ToString(); //Produced a runtime error. ("Nullable object must have a value.")
पहले जैसा ही सब। ध्यान रखें कि int? val = new int?(null);निर्माणकर्ता को दिए गए अशक्त के साथ , प्रारंभिक संकलन में, एक कंपाइल समय त्रुटि उत्पन्न होगी, क्योंकि अशक्त वस्तु का VALUE शून्य नहीं है। यह केवल आवरण वस्तु ही है जो अशक्त को बराबर कर सकती है।
इसी तरह, हम एक संकलन समय त्रुटि प्राप्त करेंगे:
int? val = new int?();
val.Value = null;
उल्लेख नहीं है कि val.Valueवैसे भी केवल पढ़ने के लिए संपत्ति है, जिसका अर्थ है कि हम भी कुछ का उपयोग नहीं कर सकते हैं:
val.Value = 3;
लेकिन फिर से, बहुरूपिक ओवरलोड किए गए निहित रूपांतरण ऑपरेटरों ने हमें ऐसा करने दिया:
val = 3;
हालांकि, जब तक यह सही काम करता है तो पॉलीसोमिंग व्हाटमचैलिट्स के बारे में चिंता करने की ज़रूरत नहीं है? :)