दिलचस्प पोस्ट
एक रिकॉर्ड में एकाधिक शब्द मिलान करने के लिए MySQL का चयन करें या REGEXP स्टार्टअप पर टॉमकेट कॉन्फ़िगरेशन में मैं सिस्टम गुणों को कैसे निर्दिष्ट कर सकता हूं? ओपनसीवी में छेद भरें माँगोडब में स्ट्रिंग को बदलने के लिए बूलियन एचटीएमएल गुण बिटमैप इमेज के विशिष्ट पिक्सेल रंग ढूँढना पीएनजी बनाम जीआईएफ बनाम जेपीईजी बनाम एसवीजी – जब सबसे अच्छा उपयोग करना है? वेब पेज से दूर नेविगेट करते समय अलर्ट एक नेस्टेड क्लास टेम्प्लेट का आंशिक स्पेशलाइजेशन क्यों अनुमत है, जबकि पूरा नहीं है? कैसे सी + + में एक स्ट्रिंग समय की एक चर संख्या दोहराने के लिए? वेबब्रोवर नियंत्रण सीमाएं विकिपीडिया से इन्फोबॉक्स डेटा कैसे प्राप्त करें? कम्पास के साथ संसा 3.3 है? एचटीएमएल फ्लोट सही तत्व ऑर्डर बदलने से पहले चयन (ड्रॉपडाउन) का मूल्य प्राप्त करना

अमान्य enum मान को int क्यों कास्टिंग नहीं अपवाद नहीं?

अगर मेरे पास एक ऐसा एन्यूम है तो:

enum Beer { Bud = 10, Stella = 20, Unknown } 

Beer प्रकार के इन मूल्यों के बाहर एक int करते समय यह अपवाद क्यों नहीं फेंकता?

उदाहरण के लिए, निम्नलिखित कोड अपवाद नहीं फेंकता है, यह कंसोल में '50' का उत्पादन करता है:

 int i = 50; var b = (Beer) i; Console.WriteLine(b.ToString()); 

मुझे यह अजीब लगता है … क्या कोई भी स्पष्ट कर सकता है?

Solutions Collecting From Web of "अमान्य enum मान को int क्यों कास्टिंग नहीं अपवाद नहीं?"

एक Enum पार्सिंग के साथ भ्रम से लिया

यह उन लोगों के एक निर्णय था जिन्होंने एनआईटी बनाया था। एक एन्यूम को अन्य मान प्रकार ( int , short , byte , इत्यादि) के द्वारा समर्थित किया जाता है, और इसलिए इसमें वास्तव में कोई भी मान हो सकता है जो उन मूल्य प्रकारों के लिए मान्य है।

मैं व्यक्तिगत रूप से इस तरह से काम करने वाला प्रशंसक नहीं हूं, इसलिए मैंने उपयोगिता पद्धतियों की एक श्रृंखला बनाई:

 /// <summary> /// Utility methods for enum values. This static type will fail to initialize /// (throwing a <see cref="TypeInitializationException"/>) if /// you try to provide a value that is not an enum. /// </summary> /// <typeparam name="T">An enum type. </typeparam> public static class EnumUtil<T> where T : struct, IConvertible // Try to get as much of a static check as we can. { // The .NET framework doesn't provide a compile-checked // way to ensure that a type is an enum, so we have to check when the type // is statically invoked. static EnumUtil() { // Throw Exception on static initialization if the given type isn't an enum. Require.That(typeof (T).IsEnum, () => typeof(T).FullName + " is not an enum type."); } /// <summary> /// In the .NET Framework, objects can be cast to enum values which are not /// defined for their type. This method provides a simple fail-fast check /// that the enum value is defined, and creates a cast at the same time. /// Cast the given value as the given enum type. /// Throw an exception if the value is not defined for the given enum type. /// </summary> /// <typeparam name="T"></typeparam> /// <param name="enumValue"></param> /// <exception cref="InvalidCastException"> /// If the given value is not a defined value of the enum type. /// </exception> /// <returns></returns> public static T DefinedCast(object enumValue) { if (!System.Enum.IsDefined(typeof(T), enumValue)) throw new InvalidCastException(enumValue + " is not a defined value for enum type " + typeof (T).FullName); return (T) enumValue; } /// <summary> /// /// </summary> /// <param name="enumValue"></param> /// <returns></returns> public static T Parse(string enumValue) { var parsedValue = (T)System.Enum.Parse(typeof (T), enumValue); //Require that the parsed value is defined Require.That(parsedValue.IsDefined(), () => new ArgumentException(string.Format("{0} is not a defined value for enum type {1}", enumValue, typeof(T).FullName))); return parsedValue; } public static bool IsDefined(T enumValue) { return System.Enum.IsDefined(typeof (T), enumValue); } } public static class EnumExtensions { public static bool IsDefined<T>(this T enumValue) where T : struct, IConvertible { return EnumUtil<T>.IsDefined(enumValue); } } 

इस तरह, मैं कह सकता हूँ:

 if(!sEnum.IsDefined()) throw new Exception(...); 

… या:

 EnumUtil<Stooge>.Parse(s); // throws an exception if s is not a defined value. 

संपादित करें

ऊपर दिए गए स्पष्टीकरण से परे, आपको यह एहसास होना चाहिए कि Enum का .NET संस्करण एक जावा-प्रेरित एक से अधिक सी-प्रेरित पैटर्न का अनुसरण करता है। इससे "बिट फ़्लैग" एन्हम करना संभव होता है जो यह निर्धारित करने के लिए बाइनरी पैटर्न का उपयोग कर सकता है कि कोई विशिष्ट "फ़्लैग" एक मान मान में सक्रिय है या नहीं। यदि आपको झंडे के हर संभावित संयोजन को परिभाषित करना पड़ा (यानी MondayAndTuesday , MondayAndWednesdayAndThursday MondayAndTuesday और MondayAndWednesdayAndThursday ), ये बेहद थकाऊ होंगे। इसलिए अपरिभाषित enum मानों का उपयोग करने की क्षमता वास्तव में आसान हो सकती है। जब आप enum प्रकारों पर असफल-तेज़ व्यवहार चाहते हैं, तो ये थोड़ा अतिरिक्त काम करने की आवश्यकता होती है, जो इन प्रकार के चालें का लाभ नहीं उठाते हैं।

एन्हम्स अक्सर झंडे के रूप में उपयोग किए जाते हैं:

 [Flags] enum Permission { None = 0x00, Read = 0x01, Write = 0x02, } ... Permission p = Permission.Read | Permission.Write; 

पी का मान पूर्णांक 3 है, जो एन्यूम का मान नहीं है, लेकिन स्पष्ट रूप से मान्य मान है।

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

संक्षिप्त उत्तर: भाषा डिजाइनरों ने इस तरह से भाषा को डिजाइन करने का फैसला किया।

लंबा जवाब: Section 6.2.2: Explicit enumeration conversions सी # भाषा विशिष्टता के Section 6.2.2: Explicit enumeration conversions कहते हैं:

दो प्रकारों के बीच एक स्पष्ट गणना रूपांतरण किसी भी सहभागी एंनाम-प्रकार को उस एंवम-प्रकार के अंतर्निहित प्रकार के रूप में इलाज करके संसाधित किया जाता है, और फिर परिणामी प्रकारों के बीच एक अंतर्निहित या स्पष्ट संख्यात्मक रूपांतरण करता है। उदाहरण के लिए, एक इंम-प्रकार ई के साथ और अंतर्निहित प्रकार के अंतराल को, ई से बाइट में एक रूपांतरण को इंट से बाइट से एक स्पष्ट सांख्यिक रूपांतरण (§6.2.1) के रूप में संसाधित किया जाता है, और बाइट से ई के लिए एक रूपांतरण संसाधित होता है एक अंतर्निहित संख्यात्मक रूपांतरण (§6.1.2) बाइट से इंट से

असल में, एन्म्यू को एक अंतर्निहित प्रकार के रूप में माना जाता है जब कोई रूपांतरण ऑपरेशन करने की बात आती है। डिफ़ॉल्ट रूप से, एक एंउम की अंतर्निहित प्रकार Int32 , जिसका अर्थ है कि रूपांतरण को Int32 रूपांतरण की तरह ही व्यवहार किया जाता है। इसका अर्थ है कि कोई भी मान्य int मान स्वीकार्य है।

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

प्रलेखन से :

प्रकार के दिनों का एक चर अंतर्निहित प्रकार की सीमा में किसी भी मूल्य को सौंपा जा सकता है; मान नामित स्थिरांक तक सीमित नहीं हैं