2009-03-17 36 views
13

Tại sao điều này trở FalseEnum Boxing và Bình đẳng

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; 
    } 

trong khi điều này trả về True?

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

Trả lời

21

Enum không thực hiện toán tử == nhưng nó ghi đè phương thức Equals.

Vì nó không thực hiện ==, hệ thống thực hiện kiểm tra bình đẳng tham chiếu. Lưu ý rằng System.Enum là một lớp không phải là một cấu trúc. Do đó, các giá trị như Directions.Left được đóng hộp. Trong trường hợp cụ thể này, các đối tượng đóng hộp kết thúc là các đối tượng riêng biệt, do đó chúng không thực hiện được phép kiểm tra bình đẳng tham chiếu.

Trình biên dịch hiểu == đối với các loại Enum cụ thể (như Chỉ đường), nhưng trình biên dịch không thực hiện xử lý đặc biệt này đối với loại System.Enum.

+0

Tốt. "Boxing" không thực sự là một lời giải thích đầy đủ, như của bạn. – core

+1

Cảm ơn bạn đã giải thích kỹ thuật! – Greg

4

JB nói, quyền anh. Bạn có thể thấy điều này bằng cách thay đổi từ Enum thành Chỉ đường:

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

true được trả lại.