2009-03-17 20 views
13

क्यों इस झूठी वापसीEnum मुक्केबाजी और समानता

public enum Directions { Up, Down, Left, Right } 

    static void Main(string[] args) 
    { 
     bool matches = IsOneOf(Directions.Right, Directions.Left, Directions.Right); 
     Console.WriteLine(matches); 
     Console.Read(); 
    } 

    public static bool IsOneOf(Enum self, params Enum[] values) 
    { 
     foreach (var value in values) 
      if (self == value) 
       return true; 
     return false; 
    } 

जबकि इस सच रिटर्न करता है?

public static bool IsOneOf(Enum self, params Enum[] values) 
    { 
     foreach (var value in values) 
      if (self.Equals(value)) 
       return true; 
     return false; 
    } 

उत्तर

21

एनम एक == समानता ऑपरेटर को लागू नहीं करता है लेकिन यह बराबर विधि को ओवरराइड करता है।

चूंकि यह == लागू नहीं करता है, इसलिए सिस्टम संदर्भ समानता जांच करता है। ध्यान दें कि System.Enum एक वर्ग है जो संरचना नहीं है। इसलिए, दिशाओं जैसे मूल्य। लिफ्ट को बॉक्स किया गया है। इस विशेष मामले में, बक्से वाली वस्तुएं अलग-अलग वस्तुएं होती हैं, इसलिए वे एक संदर्भ समानता परीक्षण में असफल होते हैं।

कंपाइलर कंक्रीट एनम प्रकार (जैसे निर्देश) के लिए == समझता है, लेकिन संकलक सिस्टम के खिलाफ यह विशेष प्रसंस्करण नहीं करता है। एनम प्रकार।

+0

अच्छा। "बॉक्सिंग" वास्तव में एक पूर्ण स्पष्टीकरण नहीं है, जैसा कि आपका है। – core

+1

तकनीकी स्पष्टीकरण के लिए धन्यवाद! – Greg

4

जैसा कि जेबी कहते हैं, मुक्केबाजी। आप एनम से दिशाओं में बदलकर इसे देख सकते हैं:

public static bool IsOneOf(Directions self, params Directions[] values) 
{ 
    foreach (var value in values) 
     if (self == value) 
      return true; 
    return false; 
} 

सत्य वापस आ गया है।

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