C# 枚举装箱与等式

C# 枚举装箱与等式,c#,.net,enums,boxing,C#,.net,Enums,Boxing,为什么返回错误 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 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;
    }

正如JB所说,拳击。通过将枚举更改为方向,可以看到这一点:

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

返回true。

枚举未实现==相等运算符,但它会重写Equals方法

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


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

Nice。“拳击”并不像你的解释那样是一个完整的解释。谢谢你的技术解释!