2010-06-04 18 views
7

कोड वर्णन करने के लिए कोशिश कर रहा है:एक बॉक्सिंग पूर्णांक कास्ट करने के लिए बाइट के लिए

 int i = 5; 
     object obj = i; 
     byte b = (byte)obj; // X 

जब चलाने के लिए, इस लाइन "एक्स" पर ("निर्दिष्ट डाली मान्य नहीं है") एक System.InvalidCastException उत्पन्न करता है। एक डबल डाली कर काम करता है:

 byte b = (byte)(int)obj; 

मुझे लगता है कि आप एक बॉक्सिंग पूर्णांक कास्ट करने के लिए एक बाइट के लिए (अगर यह सीमा 0..255 में एक मूल्य है) सक्षम होना चाहिए सोचा होगा। क्या कोई इस पर प्रकाश डाला सकता है ?

(यह मामले में 2.0 है, यह महत्वपूर्ण है)।

उत्तर

18

जो व्यवहार आप देख रहे हैं उसमें अंतर identity and representation के बीच का अंतर है।

बॉक्स से निकालना एक पहचान डाली है, और एक प्रतिनिधित्व के संरक्षण आपरेशन। int को byte पर कास्ट करना, हालांकि, प्रतिनिधित्व-बदलते (क्योंकि सटीकता का संभावित नुकसान होता है)।

आप एक InvalidCastException मिलता है जब आप के रूप में int Unbox करने की कोशिश एक byte क्योंकि बॉक्स्ड मूल्य की पहचान एक byte, यह एक int है नहीं है। जब आप byte b = (byte)obj लिखते हैं, आप क्रम, कह रहे हैं मुझे पता है कि क्या वहाँ में है है एक byte, लेकिन क्या तुम सच में है कहने के लिए, मुझे लगता है कि क्या में है वहाँ एक byte को परिवर्तित किया जा सकता है इसका मतलब यह ।

उत्तरार्द्ध कथन बनाने के लिए, आपको सबसे पहले पहचान ऑब्जेक्ट की घोषणा करना है, जो int है। फिर और केवल तभी आप byte पर एक प्रतिनिधित्व-बदलते रूपांतरण कर सकते हैं।

ध्यान दें कि यह तब भी लागू होता है जब लक्ष्य का प्रकार "बड़ा" होता है - यानी Int64सभी स्पष्ट रूपांतरण जिसके लिए गंतव्य प्रकार स्रोत प्रकार के विरासत पेड़ में नहीं है, को प्रतिनिधित्व-परिवर्तन माना जाता है। और चूंकि सभी प्रकार System.Object से प्राप्त होते हैं, इसलिए परिभाषा द्वारा अनबॉक्सिंग प्रतिनिधित्व को बदल नहीं सकता है।

+0

धन्यवाद हारून, जो इसे अच्छी तरह से समझाता है। –

5

MSDN explicitly says कि एक अलग प्रकार के लिए अनबॉक्सिंग InvalidCastException फेंक देगा।

मेरी समझ यह है कि जिस प्रकार एक चर को अनबॉक्स किया गया है वह वास्तव में underlying CIL assembly command पर पैरामीटर है। यह unbox ऑपोड है जो वास्तव में InvalidCastException फेंकता है।

ऑब्जेक्ट को वैलटाइप के रूप में बॉक्स नहीं किया गया है तो अवैध कैस्ट अपवाद फेंक दिया गया है।

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