निम्नलिखित ::अनबॉक्सिंग एनम्स क्यों अजीब परिणाम उत्पन्न करता है?
Object box = 5;
int @int = (int)box; // int = 5
int? nullableInt = box as int?; // nullableInt = 5;
StringComparison @enum = (StringComparison)box; // enum = OrdinalIgnoreCase
StringComparison? nullableEnum = box as StringComparison?; // nullableEnum = null.
2 बातें ::
- मैं
StringComparison
को क्यों Unbox कर सकते हैं पर विचार करें? मुझे लगता है कि ऐसा इसलिए है क्योंकि यह अंतर्निहित प्रकारInt32
है लेकिन मुझे अभी भी यह अजीब लगता है। nullableEnum
क्यों शून्य का मूल्य है?
जैसा कि मैं समझता हूं कि एकमात्र मान्य अनबॉक्सिंग बॉक्स किए गए मान प्रकार से है, यह प्रकार या नालीबल प्रकार के लिए है। यदि int
Enum
पर अनबॉक्स कर सकता है, तो शून्य के मूल्यों के लिए समान क्यों नहीं है? इसी तरह, अगर 5 के बजाय मैंने StringComparison.OrdinalIgnoreCase
बॉक्स किया, तो यह होगा कि nullableInt
शून्य होगा, लेकिन nullableEnum
नहीं होगा।
पुन: रनटाइम में बग: मैं नहीं कहूंगा कि यह रनटाइम में * * बग * है; बल्कि, रनटाइम कुछ मामलों में सी # spec की तुलना में अधिक उदार है। यह केवल अत्यधिक लागत पर है कि हम सी # कार्यान्वयन के व्यवहार को वास्तविक लाभ के लिए, कल्पना के सख्त कार्यान्वयन के लिए प्रतिबंधित कर सकते हैं। –
पुन: "संगत" प्रकार: हाँ, यह spec में हाथ का एक हाथ है। सीएलआर नियम थोड़ा असंगत हैं। उदाहरण के लिए, यह दिलचस्प है कि भले ही int और uint को एआरएल कॉन्वर्सिस के प्रयोजनों के लिए सीएलआर में संगत प्रकार माना जाता है, फिर भी उन्हें अनबॉक्सिंग के प्रयोजनों के लिए सीएलआर में संगत प्रकार नहीं माना जाता है, भले ही int और enum हैं। –
उचित बिंदु, "बग" थोड़ा कठोर है। मैं पहली उद्धृत बिट को "int के लिए अनबॉक्सिंग" के रूप में पढ़ रहा था, जब इंट वर्किंग के लिए अनबॉक्सिंग करते समय काम करना चाहिए ", जब यह वास्तव में" int को अनबॉक्सिंग कर रहा है? तो काम करना चाहिए * int * करना * काम करना चाहिए "। मेरा मुद्दा वास्तव में था कि spec माइकल के अंतर्ज्ञान से सहमत है और अलग-अलग परिणाम एक जानबूझकर डिजाइन निर्णय के बजाए रनटाइम की उदारता का "दुर्घटना" है जो निरर्थक enums को अनबॉक्सिंग अमान्य होना चाहिए। – stevemegson