2013-06-06 7 views
8

कोड के इस बिट लें:सी # एनम - * काम * से * निहित * कास्टिंग क्यों करता है?

enum En { 
    val1, 
    val2, 
} 

void Main() 
{ 
    En plop = 1; //error: Cannot implicitly convert type 'int' to 'En' 
    En woop = 0; //no error 
} 
बेशक यह विफल रहता है जब एक enum प्रकार चर को 1 देने की

। (एक स्पष्ट कलाकार को थप्पड़ मारो और यह काम करेगा।)

मेरा प्रश्न है: 0 को निर्दिष्ट करते समय यह विफल क्यों नहीं होता?

+1

** डुप्लिकेट ** [क्यों enum के लिए स्विच 0 पर अंतर्निहित रूपांतरण स्वीकार करता है लेकिन किसी भी अन्य पूर्णांक के लिए नहीं?] (Http://stackoverflow.com/questions/14950750/why-switch-for-enum-accepts- अंतर्निहित-रूपांतरण-से-0-लेकिन-कोई-किसी-अन्य-पूर्णांक के लिए) ** और ** [कंपाइलर मान प्रकार संकल्प और हार्डकोडेड "0" पूर्णांक मान] (http://stackoverflow.com/questions/14224465/संकलक-मूल्य-प्रकार संकल्प और hardcoded-0-पूर्णांक मान)। –

+0

निश्चित डुप्ले, संक्षिप्त उत्तर, क्योंकि यह करता है। डिफ़ॉल्ट रूप से – Jodrell

+0

, यदि पहले गणना सदस्य का मान घोषणा में सेट नहीं है, तो इसका मान शून्य है। http://msdn.microsoft.com/en-us/library/ms182149(v=vs.100).aspx –

उत्तर

9

यह इस तरह से है, क्योंकि है कि क्या कल्पना का कहना है ...

यह एक और कारण है कि यह हमेशा एक अच्छा विचार अपने सभी enums 0 मान एक आइटम देने के लिए है 'क्योंकि आप उन्हें हासिल कर सकते हैं कभी-कभी उस मूल्य के साथ।


सी # भाषा कल्पना 6.1.3 में उचित अनुभाग:

6.1.3 अंतर्निहित गणना रूपांतरण

एक अंतर्निहित गणना रूपांतरण दशमलव-पूर्णांक शाब्दिक 0 करने के लिए परमिट किसी भी enum-type और किसी भी शून्य-प्रकार के रूप में परिवर्तित किया जाना चाहिए जिसका अंतर्निहित प्रकार एक enum-type है। बाद के मामले में रूपांतरण का मूल्यांकन अंतर्निहित enum-type में परिवर्तित करके और परिणाम लपेटकर (§4.1.10) किया जाता है।

क्यों के रूप में यह इस तरह है - अच्छी तरह से, मैं सिर्फ फैसला करता है कि इन बातों को पता होगा भाषा समिति पर किसी को लगता है कि।

वास्तव में, यदि आपके पास मूल प्रश्न पर कच्चे टिप्पणी की टिप्पणी है तो हमारे पास ऐसा कुछ है।

+2

क्या आप उस पर विस्तार कर सकते हैं? –

+1

मुझे नहीं लगता कि यह प्रश्न का उत्तर कैसे देता है। डिफ़ॉल्ट प्रारंभिकरण में कोड में 'myEnum = 0' की अनुमति देने वाले कंपाइलर के साथ कुछ लेना देना नहीं है। आप ' 0' एक स्ट्रक्चर के लिए, लेकिन वे अभी भी डिफ़ॉल्ट रूप से प्रारंभ हो जाते हैं। आप 'बूल' को '0' असाइन नहीं कर सकते हैं, लेकिन फिर भी उन्हें डिफ़ॉल्ट प्रारंभ किया जाता है। – Rawling

+1

@ राउलिंग गुड प्वाइंट, मैं प्रशंसा करूंगा –

1

कारण आप केवल 0 का उपयोग कर सकते हैं क्योंकि 0 हमेशा वैध enum प्रकार होगा जहां 1,2,3 या कोई अन्य नंबर एक वैध प्रकार नहीं हो सकता है। उदाहरण के लिए कोशिश इस

enum En { 
val1=1, 
val2=2, 
} 

0 अभी भी एक मान्य enum प्रकार क्योंकि 0 कोई फर्क नहीं पड़ता कि आप क्या करते डिफ़ॉल्ट है। जिसका अर्थ है कि यदि आप अपने मानों में से एक को 0 के बराबर नहीं होने देते हैं तो यह आपके लिए 0 enum प्रकार उत्पन्न करेगा।

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