これについて疑問に思ったので、聞いてみようと思います。
表示されるほとんどの場所では、Equalsをオーバーライドするために、メンバーごとの同等性のためにGetHashCodeと同じセマンティックロジックを使用しています...ただし、通常は異なる実装を使用します。
public override bool Equals(object obj)
{
if (obj == null || GetType() != obj.GetType())
{
return false;
}
var other = (MyType)obj;
if (other.Prop1 != Prop1)
{
return false;
}
return true;
}
public override int GetHashCode()
{
int hash = -657803396;
num ^= Prop1.GetHashCode();
return num;
}
タイプにメンバーごとの等式を実装している場合(たとえば、辞書に格納する場合)、GetHashCodeをオーバーライドしてから、Equalsに対して次のようにします。
public override bool Equals(object obj)
{
return this.HashEqualsAndIsSameType(obj);
}
public static bool HashEquals(this object source, object obj)
{
if (source != null && obj != null)
{
return source.GetHashCode() == obj.GetHashCode();
}
if (source != null || obj != null)
{
return false;
}
return true;
}
public static bool HashEqualsAndIsSameType<T>(this T source, object obj)
{
return (obj == null || obj.GetType() == typeof(T)) && source.HashEquals(obj);
}