Nullable <int> वृद्धि अपवाद क्यों नहीं है?


98

क्या आप समझा सकते हैं, Console.WriteLine खाली लाइन क्यों लिखता है ( Console.WriteLine(null)मुझे संकलन त्रुटि दें) और NullReferenceException क्यों नहीं है (यहां तक ​​कि a+=1इसे नहीं उठाना चाहिए)?

int? a = null;
a++; // Why there is not NullReferenceException? 
Console.WriteLine(a); // Empty line

सभी तीन ऑपरेटरों की ++, +=और +वेरिएंट को उठा लिया है। इसलिए बयानों a++;, a += 1;और a = a + 1;सभी की अनुमति है। प्रत्येक उपज null(कोई अपवाद नहीं फेंका गया) यदि aशुरू में है null
जेपी स्टिग नील्सन

5
NullReferenceException? लेकिन int?यह एक नहीं है Reference, यह सिर्फ एक है intजो nullमूल्य ले सकता है
खालेड .K

जवाबों:


124

आप एक लिफ्ट ऑपरेटर के प्रभाव को देख रहे हैं

C # 5 विनिर्देशन की धारा 7.3.7 से:

लिफ्ट किए गए ऑपरेटर पूर्वनिर्धारित और उपयोगकर्ता-परिभाषित ऑपरेटर को अनुमति देते हैं जो उन प्रकारों के अशक्त रूपों के साथ गैर-अशक्त मूल्य प्रकारों पर भी काम करते हैं। निम्नांकित ऑपरेटरों को पूर्वनिर्धारित और उपयोगकर्ता-परिभाषित ऑपरेटरों से निर्मित किया जाता है जो कुछ आवश्यकताओं को पूरा करते हैं, जैसा कि निम्नलिखित में वर्णित है:

  • यदि + ++ - -- ! ~ कोई परिचालक और परिणाम प्रकार दोनों गैर-अशक्त मान प्रकार हैं, तो एक ऑपरेटर का उठा हुआ रूप मौजूद होता है। उठा हुआ रूप ?ऑपरेंड और परिणाम प्रकारों में एक एकल संशोधक जोड़कर बनाया गया है । यदि ऑपरेटर शून्य है, तो उठा हुआ ऑपरेटर एक अशक्त मान पैदा करता है। अन्यथा, उठा हुआ ऑपरेटर ऑपरेटर को खोल देता है, अंतर्निहित ऑपरेटर को लागू करता है, और परिणाम को लपेटता है।

तो मूल रूप से, a++इस मामले में null( ए) के परिणामस्वरूप एक अभिव्यक्ति है int?और चर को अछूता छोड़ दिया गया है।

जब तुमने फोन किया

Console.WriteLine(a);

इसमें बॉक्सिंग की जा रही है object, जो इसे एक शून्य संदर्भ में परिवर्तित करता है, जिसे एक खाली लाइन के रूप में प्रिंट किया जाता है।


3
क्या बिना उपयोग किए "नल" छपवाने का कोई तरीका है Console.WriteLine(a == null ? "null" : a)?
कोल जॉनसन

5
@Cole जॉनसन: Console.WriteLine (एक ?? "null"); :)
डेविड चैपल

2
@DavidChappelle जब aप्रकार का होता है int?, तो मैं कहूंगा कि a ?? "null"दोनों ऑपरेंड के लिए कोई सामान्य प्रकार नहीं है। आपको एक संकेत की आवश्यकता objectहै जो सामान्य प्रकार है। इसलिए या तो आपरेड कास्ट करें। aबॉक्सिंग की जाएगी। उदाहरण के लिए ((object)a) ?? "null"या a ?? (object)"null"
जेपी स्टिग नीलसन

उत्तम। क्या आप कल्पना से लिंक कर सकते हैं? क्या हम इसे तब परिभाषित कर सकते हैं जब हम अपनी कक्षाओं में ऑपरेटरों को अधिभारित करते हैं?
फिल

@teabaggs: मैं आसानी से अभी लिंक नहीं कर सकता, और लिंक सिर्फ एक वर्ड डॉक (जो आप एक खोज के साथ आसानी से पर्याप्त पा सकते हैं) के लिए होगा। जब आप ऑपरेटर ओवरलोड को परिभाषित करते हैं, तो आप स्वचालित रूप से उठाते हैं, जहां उपयुक्त हो।
जॉन स्कीट

116

जॉन का जवाब सही है लेकिन मैं कुछ अतिरिक्त नोट्स जोड़ूंगा।

Console.WriteLine(null)संकलन त्रुटि क्यों देता है ?

19 ओवरलोड हैं Console.WriteLineऔर उनमें से तीन एक पर लागू होते हैं null: एक जो एक लेता है string, वह जो एक लेता है char[]और एक एक लेता है object। C # यह निर्धारित नहीं कर सकता कि आप इन तीनों में से किसका अर्थ रखते हैं, इसलिए यह एक त्रुटि देता है। Console.WriteLine((object)null)कानूनी होगा क्योंकि अब यह स्पष्ट है।

Console.WriteLine(a)एक खाली लाइन क्यों लिखता है?

aएक अशक्त है int?। अधिभार संकल्प objectविधि के संस्करण को चुनता है , इसलिए int?एक अशक्त संदर्भ के लिए बॉक्सिंग की जाती है। तो यह मूल रूप से एक ही है Console.WriteLine((object)null), जो एक खाली लाइन लिखता है।

NullReferenceExceptionवेतन वृद्धि पर क्यों नहीं है ?

आप के बारे में चिंतित हैं , जहां अशक्त संदर्भ है? aएक अशक्त है int?जिसके साथ शुरू करने के लिए एक संदर्भ प्रकार नहीं है! याद रखें नल मूल्य प्रकार के होते हैं, मूल्य प्रकार , नहीं संदर्भ प्रकार , इसलिए उन्हें संदर्भ अर्थ विज्ञान है जब तक कि वे एक संदर्भ प्रकार के बॉक्सिंग कर रहे हैं उम्मीद नहीं है। इसके अलावा कोई बॉक्सिंग नहीं है।


0

क्या आप अशक्त बढ़ रहे हैं ???

int? a = null;
a++;

इस कथन का सीधा मतलब है कि null++null + 1।

इस दस्तावेज़ के अनुसार, एक अशक्त प्रकार अपने अंतर्निहित मूल्य प्रकार के लिए मूल्यों की सही सीमा का प्रतिनिधित्व कर सकता है, साथ ही एक अतिरिक्त अशक्त मूल्य भी। अशक्त, स्पष्ट "Nullable of Int32," को किसी भी मान को -2147483648 से 2147483647 पर सौंपा जा सकता है, या यह को शून्य मान सौंपा जा सकता है

यहाँ आप अशक्त वृद्धि कर रहे हैं, तो यह भी शून्य मान नहीं 0 या किसी अन्य पूर्णांक बन जाएगा।

क्यों यह त्रुटि के बजाय रिक्त प्रिंट करता है ??

जब आप अशक्त मान के साथ एक अशक्त प्रकार प्रिंट करते हैं तो यह त्रुटि के बजाय रिक्त प्रिंट करता है क्योंकि आप किसी चर या मान को किसी स्मृति स्थान पर प्रिंट कर रहे हैं। जो शायद शून्य या कोई पूर्णांक हो।

लेकिन जब आप अशक्त का उपयोग करके प्रिंट करने का प्रयास करते हैं Console.WriteLine(null), क्योंकि अशक्त एक चर नहीं है, इसलिए यह किसी भी मेमोरी स्थान को संदर्भित नहीं करता है। और इसलिए यह त्रुटि देता है "NullReferenceException"

फिर आप किसी भी पूर्णांक का उपयोग करके कैसे प्रिंट कर सकते हैं Console.WriteLine(2);??

इस स्थिति में, 2 को अस्थायी स्थान पर मेमोरी मिल जाएगी, और सूचक उस मेमोरी स्थान को प्रिंट करने के लिए इंगित करता है।

हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.