2015-05-15 27 views
7

में शिकायत कर रहा है नहीं मैं दृश्य स्टूडियो में निम्नलिखित है, और इसके शिकायत नहीं:क्यों किसी पूर्णांक के संयोजन और एक स्ट्रिंग संकलन समय

int? int1; 
int? int2; 

string str = int1 + "-" + int2; 

मेरा अनुमान है इस क्रम में कहीं न कहीं एक अपवाद फेंक जाएगा, लेकिन दृश्य स्टूडियो यह क्यों अनुमति दे रहा है? सिर्फ इसलिए कि यह शून्य हो सकता है? क्या एक शून्य int एक समान स्ट्रिंग के समान व्यवहार किया जाता है?

+0

यदि आप इसे पसंद करते हैं तो यह जावास्क्रिप्ट की तरह लगता है ... – usr

उत्तर

9

+ ऑपरेटर के लिए भार के की एक संख्या हैं, उनमें से दो हैं:

operator + (string s, object o) 
operator + (object o, string s) 

प्रभाव इसका यह है कि आप किसी भी प्रकार की ऑब्जेक्ट को स्ट्रिंग में "जोड़" सकते हैं।

ओवरलोड का कार्यान्वयन ToString का उपयोग उस ऑब्जेक्ट का स्ट्रिंग प्रस्तुति प्राप्त करने के लिए करेगा और इसे स्ट्रिंग के साथ जोड़ देगा। हालांकि, यह किसी भी शून्य ऑब्जेक्ट (या तार) का इलाज करेगा जैसे कि वे एक खाली स्ट्रिंग हैं, और रनटाइम पर अपवाद नहीं फेंकते हैं।

ध्यान दें कि, एक object यह मूल्य में परिणाम होगा करने के लिए एक int? पास करने का एक परिणाम के रूप बॉक्सिंग जा रहा है, क्योंकि यह एक struct है, और मुक्केबाजी के लिए विशेष सहायता वहाँ Nullable<T> ऐसी है कि अगर HasValue गलत है (यानी यह तार्किक एक का प्रतिनिधित्व करता है शून्य मान) यह बॉक्सिंग null बॉक्सिंग के बजाय Nullable बॉक्सिंग करता है जो शून्य का प्रतिनिधित्व करता है।

+0

दिलचस्प। तो मान लीजिए कि 'int1' 'null' है, यह इसे स्ट्रिंग में बदलने के लिए' ToString()' का उपयोग करता है, और उसके बाद 'null' स्ट्रिंग को खाली स्ट्रिंग के रूप में मानता है? लेकिन पहले स्थान पर 'ToString() 'को कॉल नहीं करना अपवाद फेंक देगा? –

+0

@GrantWinney यह होगा, लेकिन ऑपरेटर का कार्यान्वयन विशेष रूप से पहले शून्य के लिए जांचता है, और शून्य मानों का व्यवहार करता है जैसे कि वे एक खाली स्ट्रिंग थे, जैसा कि मैंने अपने उत्तर में कहा था। – Servy

+0

गहराई से स्पष्टीकरण के लिए धन्यवाद, अब समझ में आता है –

5

+ ऑपरेटर यहां सम्मेलन है, इसके अतिरिक्त नहीं है।

दूसरा, + ऑपरेटर Nullable<T> के लिए अधिभारित है जिस तरह से NullReferenceException एस नहीं होता है।

हालांकि आपका कोड संकलित नहीं होगा क्योंकि आपने int1 और int2 को किसी मान पर सेट नहीं किया है। हालांकि यदि आप null का उपयोग करते हैं, तो कोड string परिणाम केवल "-" होगा।

यहाँ अपने कोड के साथ एक CodingGround परियोजना है और यह सिर्फ "-" आउटपुट: http://goo.gl/sHMqk4

+1

इस विशेष मामले में '+ 'ऑपरेटर के ओवरलोड को' शून्य 'प्रकार शामिल नहीं किया जाएगा। अगर वह दो 'int' 'मान (या एक और एक 'int') गुजर रहा था तो यह होगा। – Servy

+0

स्पष्टीकरण के लिए धन्यवाद, मैंने शीर्षक को –

+0

* के अलावा शीर्षक से बदल दिया है। दूसरा, + ऑपरेटर को Nullable के लिए अधिभारित किया गया है जिससे NullReferenceExceptions का कारण नहीं बनता है। * सी # में, 'स्ट्रिंग' अतिरिक्त' शून्य 'मूल्य। उन्हें '# – xanatos

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