2012-10-04 17 views
8

मुझे अभी इस प्रश्नोत्तरी को एक सहयोगी से मिला है जो मुझे पागल कर रहा है। कोड के इस स्निपेट के लिए:निरर्थक प्रकार GetType() अपवाद फेंकता है

var x = new Int32?(); 
string text = x.ToString(); // No exception 
Console.WriteLine(text); 
Type type = x.GetType(); // Bang! 

है क्यों पहले भाग .ToString() एक अपवाद है और फिर GetType (करने के लिए कॉल फेंकने के बिना काम करता है) एक NullReferenceException फेंकता है?

उत्तर

17

ToStringoverridden in Nullable<T> है, इसलिए कॉल करने के लिए कोई मुक्केबाजी शामिल नहीं है।

GetType() वर्चुअल विधि नहीं है, इसलिए ओवरराइड नहीं किया गया है (और नहीं किया जा सकता है), तो कॉल को कॉल करने से पहले बॉक्स को बॉक्स किया गया है ... और मुक्केबाजी एक शून्य मूल्य के एक शून्य मूल्य को देता है शून्य संदर्भ।

मुक्केबाजी के लिए कारण सी # 4 कल्पना की धारा 7.5.5 में है:

तो M एक उदाहरण समारोह सदस्य एक संदर्भ प्रकार में घोषित है:

  • ..
  • यदि का प्रकार मूल्य-प्रकार है, तो बॉक्सिंग रूपांतरण (4.3.1) E कोटाइप करने के लिए परिवर्तित किया जाता है, और E को निम्नलिखित चरणों में object का प्रकार माना जाता है।

    var x = new Int32?(10); 
    

    आपको देय फिर प्रकार, typeof(int) के रूप में ही किया जा रहा है को रखना होगा: इस मामले में, M केवल यह है कि आप था की System.Object

नोट एक सदस्य हो सकता है मुक्केबाजी। एक मूल्य foo बनाने का कोई तरीका नहीं है, जैसे foo.GetType() सामान्य GetType() विधि का उपयोग करके एक शून्य मूल्य प्रकार देता है। (आप एक नईGetType() निश्चित रूप से विधि बना सकते हैं, लेकिन यह एक पक्ष मुद्दा :)

(का फायदा नहीं है "बैंग!" तुम पागल गाड़ी चला है कि अगर है के लिए कहा प्रश्नोत्तरी मुझे हो सकता है। क्षमा याचना के लेखक का सुझाव मामला।)

+0

ठीक है .. लेकिन फिर आखिरी पंक्ति को प्रतिस्थापित क्यों करें: var boxed = (Int32) x; इसके बजाए InvalidOperationException फेंकता है? क्या वह मुक्केबाजी नहीं है और उसे एक ही अपवाद फेंकना चाहिए? – kabaros

+0

@ कबरोस: नहीं, यह बिल्कुल मुक्केबाजी नहीं है - न तो 'Int32?' और न ही 'Int32' संदर्भ प्रकार हैं। यह सी # 4 spec के सेक्शन 6.2.3 में वर्णित एक स्पष्ट रूपांतरण है। –

+1

ओह हाँ, ज़ाहिर है, यह सही समझ में आता है। बहुत बहुत धन्यवाद। जिस तरह से आपको पागल करने के लिए क्षमा किया जाता है, वैसे ही महान पुस्तक :) – kabaros

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