2011-08-25 9 views
18

मैं एक वेब सेवा विधि पर काम कर रहा था जो पैरामीटर के रूप में इन्स की एक सरणी प्राप्त करेगा, और फिर, विधि के अंदर, मैंने सरणी में मूल्यों को enum मानों में परिवर्तित कर दिया, और उन्हें संग्रहीत किया एक enum सूची। हालांकि, जब कोई मूल्य enum में नहीं है, तो यह किसी भी समस्या के साथ enum सूची में जोड़ा जाता है। नहीं InvalidCastException, कुछ भी नहीं।सी # एनम सरणी एक गलत मान को स्वीकार कर रहा है

static class Program 
{ 
    static void Main(string[] args) 
    { 
     List<TestValues> values = new List<TestValues>() { 
      TestValues.Value1, 
      TestValues.Value2, 
      (TestValues)15 
     }; 

     foreach (var val in values) 
      Console.WriteLine(val); 

     Console.Read(); 
    } 

    enum TestValues 
    { 
     Value1 = 2, 
     Value2 = 4, 
     Value3 = 8 
    } 
} 

जब मैंने इसे चलाने के लिए, उत्पादन होता है:: मैं एक परीक्षण परियोजना है कि इस तरह दिखता है बना

Value1 
Value2 
15 

अपने वेब सेवा के लिए, मैं एक सत्यापन को लागू करेंगे, तो यह hapen कभी नहीं होगा बिलकुल। लेकिन ... यह अजीब है! रनटाइम InvalidCastException या ArgumentOutOfRangeException या कुछ समान नहीं फेंकना चाहिए? चूंकि मुझे enums (और int मान नहीं) की एक सूची मिली है, इसलिए मैं मानों को enum के मानों तक सीमित करना चाहता हूं (यही एक enum के लिए है)।

क्या मुझे कुछ याद आ रही है? क्या यह एक .NET बग है, एक सी # बग है या क्या ऐसा कुछ है जिसे मैं enums के साथ नहीं जानता?

+0

गड़बड़ प्रश्न के लिए +1 – Tigran

+1

पढ़ें यह एक: [क्यों अमान्य enum मान के पूर्णांक कास्टिंग करता है नहीं अपवाद फेंक?] [1] [1]: http://stackoverflow.com/ प्रश्न/6413804/क्यों-करता-कास्टिंग-इंट-टू-अमान्य-एनम-वैल्यू-न-फेंक-अपवाद – vinayvasyani

उत्तर

19

आप enum पर कोई मान निर्दिष्ट कर सकते हैं कि अंतर्निहित प्रकार की अनुमति है। डिफ़ॉल्ट रूप से, अंतर्निहित प्रकार int है, इसलिए आप enum पर int मान असाइन कर सकते हैं।

इसके लिए मुख्य कारण यह है कि अगर आप एक [Flags] गणन है, तो आप समग्र मान निर्दिष्ट करने में सक्षम होना चाहता हूँ:

[Flags] 
public enum MyFlags 
{ 
    A = 1, 
    B = 2 
} 

MyFlags flags = (MyFlags)3; // Equivalent to setting A and B 

अधिमानतः तुम सिर्फ गणन मान का उपयोग करेंगे कि क्या करना है, हालांकि:

MyFlags flags = MyFlags.A | MyFlags.B; // Sets flags to 3 

यह निश्चित रूप से ध्यान दें, कि [Flags] विशेषता यह असाइनमेंट सक्षम करने की आवश्यकता नहीं है महत्वपूर्ण है। सभी enum के पास इस संपत्ति को डिजाइन किया गया है।

जैसा कि कई लोगों ने बताया है, आप यह निर्धारित करने के लिए Enum.IsDefined() का उपयोग कर सकते हैं कि कोई विशेष मान किसी दिए गए enum के लिए मान्य है या नहीं। इससे आपकी मान्यता में मदद मिलनी चाहिए।

+0

मैं पूरी तरह से '[ध्वज]' के बारे में भूल गया, क्योंकि मैं शायद ही कभी इसका उपयोग करता हूं। मेरे लिए, यह उस उपयोग के लिए एक स्पष्ट लाभ की तरह प्रतीत होता है, लेकिन enums के अधिक आम उपयोग के लिए थोड़ा अजीब लगता है। वैसे, टिप्पणियां और अन्य उत्तरों विषय के लिए अच्छे पूरक लिंक प्रदान करते हैं। – Raphael

1

आप हमेशा int के आधार पर एक enum के लिए कोई int मान डाल सकते हैं। यह डिज़ाइन द्वारा है, क्योंकि कलाकारों को सभी कानूनी मूल्यों की जांच करने के लिए बहुत धीमी होगी।

+1

मुझे नहीं लगता कि गति निर्णय लेने वाला कारक था। –

+0

@ हेंक - कृपया विस्तृत करें, क्या ध्वज के अलावा कोई अन्य कारक हैं? –

1

यह निर्धारित करने के लिए कि int को enum के भीतर परिभाषित किया गया है, तो आप Enum.IsDefined का उपयोग कर सकते हैं।

Enum.IsDefined(typeof(TestValues), 15); 
5

हां, जब आप एक enum मान में कनवर्ट करते हैं तो परिभाषित मानों की कोई जांच नहीं होती है।

आप यदि किसी विशिष्ट मान परिभाषित किया गया है की जाँच करने के IsDefined विधि का उपयोग कर सकते हैं:

if (Enum.IsDefined(typeof(TestValues), value)) ... 
1

आप निम्न धागा पढ़ना चाहिए:

Why does Enum.Parse create undefined entries?

संक्षेप में, यह वैध है। यदि आप यह जांचना चाहते हैं कि मान परिभाषित किया गया है, तो Enum.IsDefined का उपयोग करें।

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