Equals(object)
をGetHashCode()
実装するときは常にオーバーライドする必要があるという事実を認識していますIEquatable<T>.Equals(T)
。
Equals(object)
ただし、状況によっては、ジェネリックよりも優先される理由がわかりませんEquals(T)
。
たとえば、なぜ次のようなことが起こっているのでしょうか? インターフェイスを宣言IEquatable<T>
し、具体的な型を実装すると、それらの型の項目を相互に比較するときX
に、ジェネラルEquals(object)
が a によって呼び出されます。Hashset<X>
サイドの少なくとも 1 つがインターフェイスにキャストされる他のすべての状況では、正しいもの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)
}