2011-10-28 14 views
6

इस रूप में काम करता उम्मीद:इस टाइपकास्ट में त्रुटि क्यों होती है?

byte b = 7; 
var i = (int)b; 

यह एक InvalidCastException फेंकता है जबकि:

byte b = 7; 
object o = b; 
var i = (int)o; 

क्यों डाली एक object से असफल है जब अंतर्निहित प्रकार अभी भी byte है?

+3

यह प्रश्न इस बात की पड़ताल करता है: http://stackoverflow.com/questions/5588073/generics-casting-and-value-types-why-is-this-illegal - विशेष रूप से एरिक लिपर्ट का जवाब अच्छी पढ़ाई है। –

+0

@ मैटग्रेयर जो वास्तव में मेरी सोच का जवाब देता है। – jelbourn

उत्तर

6

क्योंकि byte में int पर स्पष्ट रूपांतरण है, लेकिन object नहीं है।

आप संकलक object वास्तव में है बता तो एक byte, तो यह एक बार फिर से आप स्पष्ट रूप से int को कास्ट करने के लिए अनुमति देगा।

byte b = 7; 
object o = b; 
var i = (int)((byte)o); 

संदर्भ:

Casting and Type Conversions
byte

+0

आह, बस इसका जवाब देना चाहता था: पी – Rob

0

आप पहली वस्तु से बाइट मिल जाना चाहिए इससे पहले कि आप यह एक पूर्णांक में बदल सकते हैं

कुछ इस तरह:

var i = (int)(byte)o; 
1

यह boxing and unboxing की CLRS उपयोग के कारण होता है। जब भी आप किसी ऑब्जेक्ट के रूप में मान प्रकार का इलाज करते हैं तो सीएलआर स्वचालित रूप से ऑब्जेक्ट के अंदर आपके लिए इस मान प्रकार को बॉक्स करेगा। CLR लेकिन केवल प्रति MSDN के रूप में उनके मूल मान प्रकार में unboxing बॉक्स्ड वस्तुओं का समर्थन:

अनबॉक्सिंग

बॉक्स से निकालना एक मूल्य प्रकार करने के लिए या के लिए एक इंटरफेस प्रकार से टाइप वस्तु से एक स्पष्ट रूपांतरण है एक मान प्रकार जो इंटरफ़ेस लागू करता है।

  • यकीन है कि यह देखते हुए मान प्रकार की एक बॉक्स्ड मूल्य है बनाने के लिए वस्तु दृष्टान्त जाँच हो रही है: एक unboxing आपरेशन के होते हैं।

  • उदाहरण से मूल्य को मूल्य-प्रकार चर में कॉपी करना।

object o = b; एक वस्तु होने के रूप में में ओ बनाया एक बॉक्स्ड बाइट और यह स्टोर करने के लिए CLR का कारण बनता है। var i = (int)o; फिर बॉक्स में बाइट को एक int में अनबॉक्स करने का प्रयास करता है। यह बॉक्स किए गए प्रकार (बाइट) के रूप में अपवाद का कारण बनता है और मान प्रकार (int) भिन्न होता है।

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