16

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

2 回答 2

25

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

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

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

于 2009-03-17T00:56:28.243 回答
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。

于 2009-03-17T00:53:20.403 回答