Enum拳击和平等

为什么返回False

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

而这会返回True吗?

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

枚举不实现==等于运算符,但它会覆盖Equals方法。

由于它没有实现==,系统执行引用相等性检查。 请注意,System.Enum是一个类而不是一个结构。 因此,诸如Directions.Left之类的值被加框。 在这种特殊情况下,盒装对象最终成为单独的对象,因此它们无法通过引用相等性测试。

编译器理解==具体的枚举类型(例如Directions),但编译器不对System.Enum类型执行此特殊处理。

正如JB所说,拳击。 您可以通过从枚举更改为方向来查看此内容:

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

返回true。