2016-05-19 15 views
6

केस 1 एक प्रकार का मेल नहीं खाता अपवाद उत्पन्न करता है। केस 2 अपेक्षित के रूप में काम करता है। क्या किसी के पास अंतर्दृष्टि है? या Int32 से किसी ऑब्जेक्ट के रूप में Int16 में परिवर्तित करने का एक बेहतर तरीका है?कास्ट ऑपरेशन 1 मामले में विफल क्यों होता है लेकिन 2 मामले में सफल होता है?

केस 1:

var i = (Int16)(object)Int32.Parse("1"); 

केस 2:

var i = (Int16)Int32.Parse("1"); 
+1

देखें http://stackoverflow.com/questions/9741788/why-does-this-cast-from-short-to-int-fail और https://blogs.msdn.microsoft.com/ericlippert/2009/ 03/1 9/प्रतिनिधित्व-और-पहचान/ – filhit

+0

@ फिलीट। उत्कृष्ट संदर्भों के लिए धन्यवाद। एसओ इस सवाल के कारण होने के करीब है। लिंक जवाब क्यों मदद करते हैं। –

+1

@ ग्रेगबोगुमिल क्यों न सिर्फ आप 'Int16.Parse ("1") का उपयोग करते हैं; '? – Mikanikal

उत्तर

11

अंतर्निहित कारण तथ्य यह है कि सी # में स्पष्ट डाली ऑपरेटर दो अलग अलग अर्थ है:

  • प्रतिनिधित्व के संरक्षण अर्थ है: "मुझे पता यह ऑब्जेक्ट प्रकार टी की हमेशा होता है, भले ही संकलक इसे स्थिर रूप से साबित नहीं कर सका - कृपया मुझे इसे सामान्य के बजाय टी के रूप में उपयोग करने दें "।
  • प्रतिनिधित्व बदलते अर्थ है: "मुझे पता इस वस्तु प्रकार टी के नहीं है, लेकिन वहाँ एक रूपांतरण यह टी में बदलने के लिए है और मैं चाहता हूँ कि रूपांतरण प्रदर्शन किया जा करने के लिए"।

    • आपका पहला टुकड़ा कहते हैं: "मुझे पता है कि इस objectनिश्चित रूप से है

    तो कारण है कि आप दो अलग-अलग व्यवहार हो रही है कि आप ऊपर अलग अलग अर्थ के प्रत्येक क्रमशः का उपयोग कर रहे है एक बॉक्स Int16 और मैं इसे इस तरह उपयोग करना चाहता हूं "। लेकिन चूंकि यह वास्तव में एक बॉक्सिंग Int32 है, इसलिए आपको एक प्रकार का मिलान अपवाद मिलता है।

  • आपका दूसरा स्निपेट कहता है: "मुझे पता है कि यह Int32निश्चित रूप सेInt16 नहीं है, लेकिन मैं इसे एक में परिवर्तित करना चाहता हूं"।

दूसरे शब्दों में, अनबॉक्सिंग केवल तभी काम करता है जब आप मूल प्रकार को अनबॉक्स करने का प्रयास करते हैं। According to Eric Lippert, इसका कारण यह है कि इसे लागू करने के लिए यह बहुत ही अव्यवहारिक था कि यह एक ही ऑपरेशन में अनबॉक्स और रूपांतरित हो सकता है।

+0

एरिक लिपर्ट से ग्रेट आलेख। – Lithium

+0

ढांचे के बाहर चीजें हमेशा अधिक सरल होती हैं। मुझे लगता है कि, एक बार अनबॉक्स किए जाने पर, एक प्रकार की जांच रूपांतरण कॉल हो सकती है। हालांकि कुछ ही मिनटों के लिए लेख पर विचार करने के बाद यह मेरी टिप्पणी है। मुझे उम्मीद है कि उस पथ के साथ कई नुकसान हैं जो वर्तमान व्यवहार से कम वांछनीय हैं। –

3

डेमियन के रूप में सही ढंग से टिप्पणी की, मैं गलत था। समस्या रूपांतरण नहीं थी, समस्या अनबॉक्सिंग ऑपरेशन में निहित है। यह केवल उसी ऑब्जेक्ट से किसी ऑब्जेक्ट से अनबॉक्सिंग की अनुमति देता है जिसे मूल रूप से बॉक्स किया गया था।

int > object > int ठीक है, int > object > short नहीं है और short > object > int है।

यह केवल तभी काम करेगा जब int को पहले संक्षेप में परिवर्तित किया गया था, जैसे: int > short > object > short ठीक है।

यह विशेष मामला भी unboxing sample on MSDN में उपयोग किया जाता है।

+0

मैं विजुअल स्टूडियो 2012 के तहत केस 1 चला रहा हूं, और यह बिना किसी त्रुटि के संकलित करता है। –

+1

यह संकलित करता है लेकिन निष्पादित नहीं करता है। –

+0

मैं यह पता लगाने की कोशिश कर रहा था कि ये रूपांतरण कहां परिभाषित किए गए थे। क्या आपको पता है कि कहां? मुझे इसे देखना अच्छा लगेगा। – Nasreddine

2

अपने पहले मामले में अपने unbox करने के लिए एक Int16 टाइप किया क्षेत्र, के बाद से वहाँ कोई अंतर्निहित रूपांतरण Int32 को object से कास्ट करने के लिए उपलब्ध है जो आप टाइप बेमेल अपवाद देता है में एक Int32 टाइप किया मूल्य कोशिश कर रहे हैं।

अपने दूसरे मामले में आप सीधे Int32 को Int16 पर कास्टिंग कर रहे हैं। चूंकि यह यहां एक प्रत्यक्ष कलाकार है, इसलिए आपको implicit type conversion (see this MSDN article for a more detailed explanation) का लाभ मिलेगा।

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