यदि आप अशक्त हैं तो Convert.ToString (नल) एक अलग मान क्यों लौटाता है?


116
Convert.ToString(null)

रिटर्न

null

जैसे मैंने उम्मीद की।

परंतु

Convert.ToString(null as object)

रिटर्न

""

ये अलग क्यों हैं?

जवाबों:


143

वहाँ के 2 अधिभार ToStringयहाँ खेलने में आते हैं

Convert.ToString(object o);
Convert.ToString(string s);

C # संकलक अनिवार्य रूप से सबसे विशिष्ट अधिभार लेने की कोशिश करता है जो इनपुट के साथ काम करेगा। एक nullमान किसी भी संदर्भ प्रकार के लिए परिवर्तनीय है। इस मामले stringमें की तुलना में अधिक विशिष्ट है objectऔर इसलिए इसे विजेता के रूप में चुना जाएगा।

में null as objectआप अभिव्यक्ति के प्रकार के रूप में जम गया है object। इसका मतलब यह है कि यह अब stringअधिभार के साथ संगत नहीं है और संकलक objectअधिभार को उठाता है क्योंकि यह एकमात्र संगत शेष है।

इस टाई ब्रेकिंग कार्य के बारे में वास्तव में बालों का विवरण C # भाषा कल्पना के खंड 7.4.3 में शामिल है।


15
ठीक। इसलिए यह दूसरे के बजाय एक अधिभार का उपयोग कर रहा है। समझ में आता है। लेकिन दोनों अधिभार एक ही बात वापस नहीं करना चाहिए? +1 btw।
जॉन मैकइंटायर

2
@ जॉनमैकइंटायर - यह विकास टीम पर निर्भर करता है न कि संकलक के रूप में।
जॉन एचएच

8
@JohnMacIntyre यदि आप Convert.ToString(string)इसे लागू करने को देखते हैं तो यह केवल एक पहचान समारोह है जबकि Convert.ToString(object)वास्तव में एक कठिन राह से गुजरना है। एक नज़र में मैं सहमत होऊंगा कि उन्हें वही लौटना चाहिए लेकिन बीसीएल की परिवर्तनीय परत ऐसी चीज नहीं है जिस पर मैं बहुत जानकार हूं और यह संभव है कि अंतर के लिए एक अच्छा कारण है (हालांकि मुझे संदेह है)
जारेडपावर

मैं एक अशक्त वस्तु को अशक्त स्ट्रिंग में परिवर्तित करने की तलाश में यहां आया था। अन्य खोजकर्ताओं का उत्तर है (string)null, या यदि आपको ऑब्जेक्ट ओ कहा जाता है, तो(string)o
रेजिनजेन

65

से इसे जारी रखते हुए JaredPar उत्तम अधिभार संकल्प जवाब - प्रश्न बना रहता है "क्यों करता है Convert.ToString(string)वापसी अशक्त, लेकिन Convert.ToString(object)वापसी string.Empty"?

और इसका जवाब है ... क्योंकि डॉक्स ऐसा कहते हैं :

Convert.ToString (स्ट्रिंग) "निर्दिष्ट स्ट्रिंग उदाहरण देता है; कोई वास्तविक रूपांतरण नहीं किया जाता है।"

Convert.ToString (ऑब्जेक्ट) "मान का स्ट्रिंग प्रतिनिधित्व, या String.Empty अगर रिटर्न शून्य है।"

संपादित करें: जैसा कि यह "कल्पना में बग" है, "बहुत खराब एपीआई डिजाइन", "यह इस तरह क्यों निर्दिष्ट किया गया था", आदि - मैं क्यों नहीं देखता इसके लिए कुछ तर्क पर एक शॉट लूंगा यह बड़ी बात है।

  1. System.Convertप्रत्येक आधार प्रकार को स्वयं में परिवर्तित करने की विधियाँ हैं । यह अजीब है - चूंकि किसी भी रूपांतरण की आवश्यकता या संभव नहीं है, इसलिए विधियां केवल पैरामीटर वापस करने के लिए समाप्त होती हैं। Convert.ToString(string)वही व्यवहार करता है। मुझे लगता है कि ये कोड पीढ़ी परिदृश्यों के लिए यहाँ हैं।
  2. Convert.ToString(object)पास होने पर 3 विकल्प हैं null। फेंक दें, वापस लौटें, या स्ट्रिंग लौटें। खाली करें। फेंकना बुरा होगा - दोगुना इसलिए कि इस धारणा के साथ उत्पन्न कोड के लिए उपयोग किया जाता है। अशक्त लौटने के लिए आपके कॉलर को एक शून्य जांच करनी होती है - फिर से, उत्पन्न कोड में एक बढ़िया विकल्प नहीं है। रिटर्निंग स्ट्रिंग.इम्प्टी एक उचित विकल्प लगता है। शेष System.Convertप्रकार के मूल्य वाले सौदे - जिनका डिफ़ॉल्ट मान होता है।
  3. यह बहस योग्य है कि क्या अशक्त लौटाना अधिक "सही" है, लेकिन string.Empty निश्चित रूप से अधिक प्रयोग करने योग्य है। बदलने का Convert.ToString(string)अर्थ है "कोई वास्तविक रूपांतरण नहीं" नियम को तोड़ना। चूंकि System.Convertएक स्थिर उपयोगिता वर्ग है, इसलिए प्रत्येक विधि को तार्किक रूप से अपना माना जा सकता है। बहुत कम वास्तविक दुनिया के परिदृश्य हैं जहां यह व्यवहार "आश्चर्यजनक" होना चाहिए, इसलिए प्रयोज्य को (संभव) शुद्धता पर जीत दें।

क्या यह कहना उचित है कि कल्पना में एक बग है?
जॉन मैकइंटायर

3
यह जवाब नहीं देता कि यह ऐसा क्यों है। यह कहना कि यह इस तरह व्यवहार करता है क्योंकि यह इस तरह का व्यवहार करने के लिए प्रलेखित है।
कोडइन्चोयोस

2
@JohnMacIntyre IMO यह कहना बहुत उचित है कि यह बहुत खराब एपीआई डिज़ाइन है।
कोडइन्कॉउंस

7
@CodeInChaos - जब तक आप BCL के विकसित होने के बाद अवलोकनीय व्यवहार के आधार पर डॉक्स नहीं लिखे जाते हैं, तब तक एक शब्दविज्ञान नहीं। मुझे लगता है कि एक अजीब धारणा होगी। IOW, यह "इस तरह का व्यवहार करने के लिए प्रलेखित" नहीं है, यह "प्रलेखित है कि यह इस तरह का व्यवहार करेगा " - यानी।, यह " इस तरह का व्यवहार करने के लिए निर्दिष्ट है"।
मार्क ब्रैकेट 19

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