2010-10-13 9 views
9

ठीक है मुझे कुछ बेहद सरल दिखाना चाहिए लेकिन मैं खो गया हूं।बॉक्सिंग द्वारा उलझन में। कास्टिंग -1 से इंट 64 फेंक देता है अमान्य कैस्टएक्सप्शन

Int64 को यह

object val = -1; 
var foo = (Int32)(val); 
var bar = (Int64)(val); 

कलाकारों को देखते हुए फेंकता है और InvalidCastException।

मुझे लगता है कि यह मुक्केबाजी के साथ कुछ अजीबता से संबंधित है लेकिन मुझे तर्क समझ में नहीं आता है।

जो मैं समझता हूं वैल को पहली पंक्ति पर Int32 के रूप में बॉक्स किया गया है।

तब जब मैं Int32 के अलावा कुछ और डालने का प्रयास करता हूं तो अवैध CastException फेंक दिया जाता है। मुझे लगता है कि इसका मतलब है कि मैं इंट 64 के रूप में वैल को अनबॉक्स करने की कोशिश कर रहा हूं जब यह वास्तव में एक इंट 32 है?

अभी भी अजीब लगता है। क्या कास्ट मूल्य को अनबॉक्स नहीं कर सका और फिर कास्ट करने की कोशिश कर सकता है?

कुछ की तरह (जाहिर है इस बुरी तरह, oversimplified शायद बॉक्स्ड प्रकार ज्ञात नहीं है तो यह संभव नहीं है?): पीछे मुझे स्कूल तर्क पर:

object val = -1; 
Int32 unboxed = (Int32)(val); 
var bar = (Int64)(unboxed); 

कोई (एरिक Lippert पढ़ें) इस।

अद्यतन: एरिक के ब्लॉग कि रीड इस के लिए एक लिंक पोस्ट से संक्षिप्त जवाब मैं "

लिए देख रहा था है ... यह उत्पन्न करने के लिए कोड की एक बड़ी राशि होगी, और यह होगा बहुत धीमा। कोड निश्चित रूप से इतना बड़ा है कि आप इसे अपनी विधि में रखना चाहते हैं और बस इसे कॉल करें। डिफ़ॉल्ट रूप से ऐसा करने के बजाय, और हमेशा धीमी, बड़ी और नाजुक कोड उत्पन्न करें, इसके बजाय हमने तय किया है कि अनबॉक्सिंग केवल सटीक प्रकार के लिए अनबॉक्स कर सकता है। यदि आप धीमी विधि को कॉल करना चाहते हैं जो कि सभी goo करता है, तो यह उपलब्ध है - आप हमेशा Convert.ToInt32 को कॉल कर सकते हैं, जो रनटाइम पर वह सभी विश्लेषण करता है तुम्हारे लिए। हम आपको "तेज़ और सटीक" या "धीमी और ढीले" के बीच पसंद देते हैं, और समझदार डिफ़ॉल्ट पूर्व है। यदि आप बाद चाहते हैं तो विधि कॉल .... "

+0

यह कुछ है। बेहद गैर सिम मिसाल। यह बहुत से लोगों को यात्रा करता है ... –

+0

रीड सही है; यह एसओ पर एक हफ्ते में कई बार पूछा जाता है। कल दो बार पूछा गया था। –

+0

तो, मैं एक ही सवाल पूछने के लिए स्पष्ट रूप से लंगड़ा हूं कि हर कोई पूछता है और पहले खोज नहीं करता है। मुझे यह दिलचस्प लगता है कि अगर यह एक आम सवाल है तो यह अभी भी 6 वोट प्राप्त करता है। स्पष्ट रूप से डिफ़ॉल्ट व्यवहार सबसे स्पष्ट व्यवहार नहीं है। –

उत्तर

15

इसका कारण यह है कि आप Unbox नहीं कर सकते हैं और एक ही आपरेशन में एक रूपांतरण प्रदर्शन करते हैं। आप कोई Int32 में Int32 मूल्य Unbox चाहिए, और फिर आगे चलकर परिवर्तित । अपने प्रकार

इस कारण से

, इस वस्तु unboxed किए जाने की आवश्यकता है, तो Int64 में बदला:

object val = -1; 
int foo = (Int32)val; 
Int64 bar = (Int64)(Int32)val; 

एरिक Lippert अपने ब्लॉग Representation and Identity शीर्षक से पोस्ट पर विस्तार से कवर किया

+0

बहुत बढ़िया, एरिक लिपर्ट प्रॉक्सी द्वारा :) आप रॉक –

+0

लिखने का एक और तरीका: 'Int64 a = -1; ऑब्जेक्ट ओ = ए; Int64 बी = (Int64) ओ; धन्यवाद धन्यवाद! – Nayan

+0

क्या लोग * कास्ट * कहने से रोक सकते हैं जब उनका मतलब * रूपांतरण * है? पूर्णांक प्रकारों के बीच कोई "कास्टिंग" नहीं है; वे * रूपांतरित * हो रहे हैं।(यह दुर्भाग्यपूर्ण है कि सी # दोनों के लिए समान वाक्यविन्यास का उपयोग करता है।) – Timwi

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