我知道我总是必须覆盖Equals(object)
并且GetHashCode()
在实施IEquatable<T>.Equals(T)
.
但是,我不明白,为什么在某些情况下Equals(object)
胜过通用Equals(T)
.
例如为什么会发生以下情况?如果我声明IEquatable<T>
一个接口并为它实现一个具体类型,则在将这些类型的项目相互比较时X
,一般Equals(object)
会被 a 调用。Hashset<X>
在至少一侧被转换为接口的所有其他情况下,Equals(T)
调用正确的。
这是一个代码示例来演示:
public interface IPerson : IEquatable<IPerson> { }
//Simple example implementation of Equals (returns always true)
class Person : IPerson
{
public bool Equals(IPerson other)
{
return true;
}
public override bool Equals(object obj)
{
return true;
}
public override int GetHashCode()
{
return 0;
}
}
private static void doEqualityCompares()
{
var t1 = new Person();
var hst = new HashSet<Person>();
var hsi = new HashSet<IPerson>();
hst.Add(t1);
hsi.Add(t1);
//Direct comparison
t1.Equals(t1); //IEquatable<T>.Equals(T)
hst.Contains(t1); //Equals(object) --> why? both sides inherit of IPerson...
hst.Contains((IPerson)t1); //IEquatable<T>.Equals(T)
hsi.Contains(t1); //IEquatable<T>.Equals(T)
hsi.Contains((IPerson)t1); //IEquatable<T>.Equals(T)
}