2010-08-30 10 views
7

मैं एक object o कि जाना जाता है होना करने के लिए एक बॉक्सिंग int या uint है:अनबॉक्सिंग uint/जानने क्या बॉक्स के अंदर है बिना पूर्णांक

object o = int.MinValue 
object o = (uint)int.MinValue // same bytes as above 

मैं क्या बॉक्स में है पता नहीं है, सब मैं के बारे में परवाह है कि वहां 4 बाइट हैं जो मैं int या uint पर सहारा देना चाहता हूं। यह एक unchecked संदर्भ जब मैं मूल्यों (बक्से के बजाय) है में ठीक काम करता है:

unchecked 
{ 
    int a = (int)0x80000000u; // will be int.MinValue, the literal is a uint 
    uint b = (uint)int.MinValue; 
} 

नोट: सी # में डिफ़ॉल्ट सब कुछ अनियंत्रित है करके, अनियंत्रित संदर्भ यहाँ केवल आवश्यक है, क्योंकि हम शाब्दिक और संकलक के साथ काम कर रहे हैं जानना चाहता है कि क्या हम वास्तव में पैर में खुद को शूट करना चाहते हैं।

समस्या अब है कि मुझे नहीं पता कि बॉक्स के अंदर क्या है (इसके 4 बाइट्स के अलावा), लेकिन रनटाइम ऐसा करता है जब मैं गलत प्रकार से अनबॉक्स करने का प्रयास करता हूं तो मुझे InvalidCastException मिलता है। मुझे पता है कि यह उचित रनटाइम व्यवहार है, लेकिन इस मामले में मुझे पता है कि मैं क्या कर रहा हूं और एक "अनचेक अनबॉक्स" चाहता हूं। क्या ऐसा कुछ मौजूद है?

मुझे पता है कि मैं catch और पुनः प्रयास कर सकता हूं, इसलिए यह उत्तर के रूप में नहीं गिना जाता है।

उत्तर

4

यदि आप संभव हो तो किसी ऑब्जेक्ट को किसी int में परिवर्तित करने के लिए Convert.ToInt32 का उपयोग कर सकते हैं, हालांकि यह रूपांतरण या पार्सिंग भी करेगा ताकि यह आपके इच्छित से धीमा हो।

आप जानते हैं कि यह किसी पूर्णांक या uint है, तो आप ऐसा कर सकते हैं:

int x = (o is int) ? (int)o : (int)(uint)o; 
+0

Convert अतिप्रवाह अपवाद को जन्म देती है (मैं अनियंत्रित बलात्कार की जरूरत है)। बॉक्स सामग्री के लिए जांच करना एक अच्छा विचार है, फिर भी उम्मीद है कि एक बेहतर समाधान है। –

+0

@ जोहान्स: आप 'अनचेक ((uint) कन्वर्ट कर सकते हैं। ToInt64 (o))' बड़े आकार में परिवर्तित करके अपवाद के आसपास पहुंचने के लिए, हालांकि यदि आपको कभी 64-बिट पूर्णांक पर काम करने की आवश्यकता होती है तो आपके पास नहीं होगा इसके साथ करने के लिए एक बड़ा आकार। – Quartermeister

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