2009-03-11 18 views
7

यदि आप सी # में एक enum घोषित करते हैं, तो डिफ़ॉल्ट प्रकार स्वचालित रूप से int है।सी # Enums और कास्टिंग

तो फिर एनम का उपयोग करते समय केस स्टेटमेंट या अन्य उदाहरणों में आपको मूल्यों का उपयोग करने के लिए स्पष्ट रूप से पुन: उपयोग करना होगा? अंतर्निहित प्रकार होने का क्या मतलब है यदि आपको स्पष्ट रूप से मामला है या मैं यहां कुछ गलत कर रहा हूं?

private enum MyEnum 
     { 
      Value1, 
      Value2, 
      Value3 
     } 

    switch (somevalue) 
       { 
        case (int)MyEnum.Value1: 
         someothervar = "ss"; 
         break; 
        case (int)MyEnum.Value2: 
         someothervar = "yy"; 
         break; 
        case (int)MyEnum.Value3: 
         someothervar = "gg"; 
         break; 
       } 
+0

यह कोड स्निपेट थोड़ा सा दिखता है। आप एक enum परिभाषित करते हैं और आने वाले पैरामीटर (कुछवृत्त) एक int है। मुझे अजीब लग रहा है ... –

उत्तर

2

तो somevalue प्रकार MyEnum की है, तो आप एक int को कास्ट करने के लिए नहीं है।

public enum Color 
{ 
    Red, 
    Blue, 
    Green 
} 

class Program 
{ 
    static void Main(string[] args) 
    { 
     Color color = Color.Red; 

     switch (color) 
     { 
      case Color.Red: 
       break; 

      case Color.Blue: 
       break; 

      case Color.Green: 
       break; 
     } 
    } 
} 
15

कुछ प्रकार का प्रकार क्या है? यदि प्रकार MyEnum कास्टिंग अनिवार्य है और बिना त्रुटि के काम करना चाहिए।

यदि प्रकार int है तो हां आपको उचित रूप से स्विच/केस करने के लिए एक MyEnum तक पहुंचना होगा। लेकिन आप प्रत्येक केस स्टेटमेंट के बजाय मूल्य कास्टिंग करके इसे थोड़ा सा सरल बना सकते हैं। उदाहरण के लिए

switch((MyEnum)somevalue) { 
    case MyEnum.Value1: ... 
} 
+0

वास्तव में -1? क्या मुझे औचित्य मिल सकता है? – JaredPar

+1

मैंने इसे कम नहीं किया, लेकिन मेरे लिए समस्या यह धारणा है कि enum के लिए कलाकार सफल हो जाएगा। क्या होगा यदि मान वैध एनम मान नहीं है? बाद में मेरा जवाब देखें। –

+2

@ वाल्डन, यह सवाल के लिए अप्रासंगिक है। सवाल यह है कि "यह संकलन क्यों नहीं करेगा"। इंट से प्राप्त होने वाले एक enum को एक int कास्टिंग करने से कोई फर्क नहीं पड़ता कि मूल्य क्या है। – JaredPar

4

स्पष्ट रूप से कुछता आपके enum के रूप में स्पष्ट रूप से टाइप की बजाय एक पूर्णांक है। आपको ध्यान रखना चाहिए कि underlying value of an enum is just the "storage type" और यह स्पष्ट रूप से विनिमय नहीं है। हालांकि, आप आसानी से अपने कोड सरल और "अधिक" प्रकार सुरक्षित बनाने के लिए डाली ऑपरेटर का उपयोग कर सकते हैं:

private enum MyEnum { Value1, Value2, Value3 } 

switch ((MyEnum)somevalue) 
{ 
    case MyEnum.Value1: 
     someothervar = "ss"; 
     break; 
    case MyEnum.Value2: 
     someothervar = "yy"; 
     break; 
    case MyEnum.Value3: 
     someothervar = "gg"; 
     break; 
    default: 
     throw new NotSupportedException(); 
} 

अंततः आप एक डिजाइन जहां एक पूर्णांक से एक enum में बदलने के लिए नहीं था चाहते हैं, लेकिन अक्सर डिस्क या डीबी से पढ़ने पर समय यह मामला नहीं है।

1

के रूप में अन्य लोगों ने कहा:

  • तो somevalue प्रकार MyEnum की है, तो आप कास्ट करने के लिए नहीं होना चाहिए।
  • यदि आप किसी डेटाबेस या टेक्स्ट फ़ाइल से पढ़ रहे हैं, तो आप स्ट्रिंग से enum value प्राप्त करने के लिए enum की पार्स विधि का उपयोग करना चाह सकते हैं।
  • यदि आपको बिल्कुल int की तुलना करना चाहिए, तो के बजाय MyEnum मान को int में डालने के बजाय MyEnum पर स्विच करना अधिक कुशल है।
संबंधित मुद्दे