我有一个名为“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);
}
我只有在将扩展方法的第一行修改为以下内容时才能获得预期行为:
x SearchKey = new x(key);
你能解释一下这个行为吗?
我本来以为,Equals()方法会在x的实例上被调用,因为x是Object的子集。但我错了吗?
GetHashCode
方法。 - BartoszKPx SearchKey = new x(key);
。你做了什么改变让它能够工作? - Eli ArbelGetHashCode
和Equals
方法。请注意,Add
和Contains
方法都会首先调用GetHashCode
方法,只有在返回的哈希码不存在于HashSet中时才会调用Equals
方法。 - havij