Enum拳击和平等

时间:2009-03-17 00:48:23

标签: c# .net enums boxing

为什么返回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;
    }

2 个答案:

答案 0 :(得分:23)

Enum没有实现==等于运算符,但它确实覆盖了Equals方法。

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

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

答案 1 :(得分:4)

正如JB所说,拳击。您可以通过从Enum更改为Directions:

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

返回true。