2017-12-31 124 views
8

के लिए गलत रिटर्न देता है मैंने स्ट्रिंग के लिए Enum.IsDefined() विधि का उपयोग किया, लेकिन मुझे False एक ऐसी स्थिति में मिलता है जहां मुझे लगता है कि मुझे True मिलना चाहिए। जांच करें नीचे दिए गए कोड:Enum.Is परिभाषित स्ट्रिंग्स

public enum YourEnum : int 
{ 
    Zero = 0, 
    One = 1 
} 

public class Program 
{ 

    public static void Main(string[] args) 
    { 
     Console.WriteLine(Enum.IsDefined(typeof(YourEnum), 1)); 
     Console.WriteLine(Enum.IsDefined(typeof(YourEnum), 1.ToString())); 
    } 
} 

C# Fiddle Demo
परिणाम:

True 
False 

मैं नहीं जानता कि क्यों मैं दूसरे मामले में False मिलना चाहिए। किसी भी मदद की सराहना की है।

+1

यह 'Enum.Parse()' है जो 'स्ट्रिंग' स्वीकार करता है। 'Enum.IsDefined()' आपके 'enum' पर परिभाषित * स्थिरांक * की तुलना कर रहा है जो आप गुजर रहे हैं। – haim770

+0

उस उत्तर में हाँ जो मेरे मुख्य प्रश्न से संबंधित नहीं है, वास्तव में' Enum.IsDefined' स्वीकार कर रहा है 'ऑब्जेक्ट' को दूसरे पैरामीटर के रूप में, मुझे यह पूछना चाहिए कि क्या 'IsDefined' भी दूसरे पैरामीटर के प्रकार की जांच करता है? –

उत्तर

19

जब आप IsDefined() विधि पर स्ट्रिंग पास करते हैं, तो आप पूछ रहे हैं कि enum में कोई नाम है, जिसका नाम है। The documentation पढ़ता है:
प्रकार enumType का कोई भी सदस्य •:

मूल्य पैरामीटर निम्न में से कोई हो सकता है।
• एक चर जिसका मूल्य enumType प्रकार का गणित सदस्य है।
एक गणित सदस्य के नाम का स्ट्रिंग प्रतिनिधित्व। स्ट्रिंग के वर्णों में गणना सदस्य नाम के समान ही होना चाहिए।
• अंतर्निहित प्रकार के enumType का एक मूल्य।

(जोर मेरा)

यह पढ़ने के लिए थोड़ा भ्रामक है क्योंकि प्रथम, द्वितीय, और चौथा एक ही बात में सभी परिणाम ऊपर दिए गए विकल्पों: enum प्रकार के एक मूल्य के पारित किया जा रहा (, के बॉक्सिंग पाठ्यक्रम)।

लेकिन तीसरा विकल्प यह है कि आपके परिदृश्य पर क्या चल रहा है, और स्ट्रिंग को नाम नामक सदस्य से मेल खाना चाहिए। आप स्ट्रिंग "1" पास कर रहे हैं, और enum में केवल वैध नाम "Zero" और "One" हैं। स्ट्रिंग "1" उनमें से किसी से मेल नहीं खाती है, इसलिए IsDefined()false देता है।

5

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

Console.WriteLine(Enum.IsDefined(typeof(YourEnum), 1)); 
Console.WriteLine(Enum.IsDefined(typeof(YourEnum), "Zero")); 

अधिक के लिए source code (line 1503) देखें। ऐसा कहकर, दस्तावेज़ीकरण से इस जानकारी को कम करना बेहतर है क्योंकि कार्यान्वयन के बाद से पीटर डिनिहो का जवाब दिखाया गया है: लेकिन फिर भी, यदि आप उत्सुक हैं तो स्रोत कोड वहां है।