ठीक है मुझे कुछ बेहद सरल दिखाना चाहिए लेकिन मैं खो गया हूं।बॉक्सिंग द्वारा उलझन में। कास्टिंग -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 को कॉल कर सकते हैं, जो रनटाइम पर वह सभी विश्लेषण करता है तुम्हारे लिए। हम आपको "तेज़ और सटीक" या "धीमी और ढीले" के बीच पसंद देते हैं, और समझदार डिफ़ॉल्ट पूर्व है। यदि आप बाद चाहते हैं तो विधि कॉल .... "
यह कुछ है। बेहद गैर सिम मिसाल। यह बहुत से लोगों को यात्रा करता है ... –
रीड सही है; यह एसओ पर एक हफ्ते में कई बार पूछा जाता है। कल दो बार पूछा गया था। –
तो, मैं एक ही सवाल पूछने के लिए स्पष्ट रूप से लंगड़ा हूं कि हर कोई पूछता है और पहले खोज नहीं करता है। मुझे यह दिलचस्प लगता है कि अगर यह एक आम सवाल है तो यह अभी भी 6 वोट प्राप्त करता है। स्पष्ट रूप से डिफ़ॉल्ट व्यवहार सबसे स्पष्ट व्यवहार नहीं है। –