c# - 枚举装箱和平等

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

最佳答案

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

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

编译器将 == 理解为具体的枚举类型(例如 Directions),但编译器不会对 System.Enum 类型进行这种特殊处理。

关于c# - 枚举装箱和平等,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/652673/

相关文章:

.net - 如果我将控件传递给不同的类以进行事件处理,是否会发生内存泄漏?

Java-连接枚举?

c# - 从一个 ViewModel 访问另一个 ViewModel 中的属性

.net - Stackexchange.Redis 的 fire and forget 是否保证交付?

c# - 当我们没有析构函数时为什么要调用 SuppressFinalize

java - java中的枚举: How can I use numbers

swift - 使用枚举时,表达式类型在没有更多上下文的情况下不明确

c# - 提高并发字典访问效率c#

c# - 将参数传递给 C# 中的工厂模式体系结构

c# - Winforms 中的所有者表单