2016-02-04 9 views
5

के लिए निर्दिष्ट मूल्यों के साथ Enum मैं सूचीकेवल कुछ सदस्यों की

public enum MyEnum 
{ 
    FirstValue, 
    SecondValue, 
    ThirdValue, 
    ForthValue = 1, 
    FifthValue = 2 
} 

का ही हिस्सा जब मैं करने की कोशिश की strina name = (MyEnum)2; नाम ThirdValue था के लिए कस्टम मूल्य के साथ एक enum है।

लेकिन जब मैं

public enum MyEnum 
{ 
    FirstValue = 3, 
    SecondValue, 
    ThirdValue, 
    ForthValue = 1, 
    FifthValue = 2 
} 

को enum बदल strina name = (MyEnum)2; नाम पर FifthValue था।

क्या संकलक (मैं विजुअल स्टूडियो 2012 का उपयोग कर रहा हूं) केवल कस्टम मानों को प्रारंभ करता है यदि पहले कस्टम मान हैं?

और यदि ThirdValue को पहले उदाहरण में डिफ़ॉल्ट मान 2 मिला तो FifthValue = 2 में कोई त्रुटि नहीं आई?

+4

प्रारंभिक उदाहरण में मान 0, 1, 2, 1, 2. दोनों 'ThirdValue होगा 'और' FifthValue' पूर्णांक मान 2 से मेल खाती है, जैसे, डिबगर सिर्फ तुम्हारे लिए मानों में से एक उठा रहा है। –

उत्तर

6

जब आप एक enum सदस्य के लिए मान निर्दिष्ट, संकलक एक के बाद मूल्य अगले सदस्य के लिए, वृद्धि कर देता है जब तक यह निर्धारित किया है। कोई सदस्य नहीं मान है, तो नंबर, 0.

आपका पहला उदाहरण पर शुरू होता है क्या संकलक कर रहा है के साथ:

public enum MyEnum 
{ 
    FirstValue, // == 0 
    SecondValue, // == 1 
    ThirdValue, // == 2 
    ForthValue = 1, 
    FifthValue = 2 
} 

ताकि आप मूल्य 2 साथ दो सदस्य हैं।

या तो उन्हें सभी मान दें, या उन्हें कोई मूल्य न दें। कुछ और संभावना भ्रम पैदा कर देगा।

सी # मानक, section 14.3 का कहना है (जोर मेरा):

एक enum सदस्य के जुड़े मूल्य असाइन किया गया है अनुमान से या स्पष्ट। यदि एनम सदस्य की घोषणा निरंतर अभिव्यक्ति प्रारंभकर्ता है, तो उस निरंतर अभिव्यक्ति का मूल्य, जो अंतर्निहित रूप से अंतर्निहित प्रकार में परिवर्तित होता है, enum सदस्य का संबंधित मान है। enum सदस्य पहले enum सदस्य enum प्रकार में घोषित है

  • हैं, तो उसके संबंधित मान शून्य है: enum सदस्य की घोषणा नहीं प्रारंभकर्ता है, तो उसके संबंधित मूल्य परोक्ष, इस प्रकार सेट किया गया है
  • अन्यथा, enum सदस्य के जुड़े मूल्य एक द्वारा टेक्स्ट रूप पूर्ववर्ती enum सदस्य के जुड़े मूल्य बढ़ द्वारा प्राप्त की है। इस बढ़े हुए मूल्य मूल्यों कि अंतर्निहित प्रकार के आधार पर किया जा सकता है की सीमा के भीतर होना चाहिए; अन्यथा, एक संकलन-समय त्रुटि होती है।
+0

हुह। इस बारे में सोच रहा था और सोचा कि अगर आप एक आइटम जो अधिकतम मूल्य है का पालन करें क्या होता है एक निर्धारित संख्या के बिना एक आइटम से (डिफ़ॉल्ट रूप से, enum मूल्यों के लिए अंतर्निहित प्रकार int है) - आप प्राप्त होता [CS0543] (https://msdn.microsoft.com/en-us/library/b531f703.aspx): "* प्रगणक मूल्य अपने प्रकार * में फिट करने के लिए बहुत बड़ा है"। –

2

संबंधित पूर्णांक मान जो मूल्य मान को मानचित्र पर हमेशा शुरू करते हैं जब तक कि आप विशेष रूप से मानों को बदल नहीं देते।

जैसे, कोड के अपने पहले टुकड़ा इस के बराबर है:

public enum MyEnum 
{ 
    FirstValue = 0, 
    SecondValue = 1, 
    ThirdValue = 2, 
    ForthValue = 1, 
    FifthValue = 2 
} 

तो आप देख सकते है कि ThirdValue और FifthValue दोनों को 2 नक्शे।

आपका दूसरे उदाहरण इस के बराबर है:

public enum MyEnum 
{ 
    FirstValue = 3, 
    SecondValue = 4, 
    ThirdValue = 5, 
    ForthValue = 1, 
    FifthValue = 2 
} 
0

एक से अधिक गणक के समान मूल्य हो सकता है। आप प्रत्येक प्रगणक के लिए मूल्य निर्दिष्ट नहीं करना चाहते हैं, बस क्रम स्विच आप प्रगणक को परिभाषित:

public enum MyEnum 
{ 
    FourthValue = 1, 
    FifthValue, 
    FirstValue, 
    SecondValue, 
    ThirdValue 
} 
संबंधित मुद्दे