c# - HashSet 未调用重写的 Equals 方法

标签 c#

<分区>

我有一个名为“x”的类,它重写了 Equals(),如下所示:

    public override bool Equals(object obj)
    {
        if(obj is x)
        {
            return ((obj as x).key == this.key);
        }
        return false;
    }

当以下扩展方法尝试使用上述覆盖进行比较时,Equals() 不会被使用:

    public static bool Contains(this HashSet<x> set, char key)
    {
        x SearchKey = new x(key);
        return set.Contains(SearchKey);
    }

只有当我如下修改 extensio 方法中的第一行时,我才会得到预期的行为:

x SearchKey = new x(key);

你能解释一下这种行为吗?

我曾预料到,Equals() 会针对 x 本身的实例被调用,因为它是 Object 的子集。我错过了什么?

最佳答案

首先,正如其他人所指出的,您还必须覆盖 GetHashCode。像这样的东西:

public override int GetHashCode()
{
    return key.GetHashCode();
}

关于c# - HashSet 未调用重写的 Equals 方法,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/19131962/

相关文章:

c# - 为 ASP.NET 成员表结构创建脚本

c# - 我的代码不执行命令代码,它只显示命令提示符,但不执行命令

c# - ASP.NET WebAPI - [FromBody] 的问题

c# - Asp.Net,SQL和TimeZones

c# - 在读取测试方法数据之前强制执行 ClassInitialize

C# 获取类的非静态属性的名称

c# - 如何设置对公共(public) Elastic Transcoder Amazon SDK 的权限

c# - 帮助我为NAO的毕业论文选择一个主题

c# - 从通用基类继承,应用约束,并在 C# 中实现接口(interface)

c# - 在 Java 中实现自定义 COM 接口(interface)