Если мы перегружаем функцию, то должны перегрузить и функцию GetHashCode наоборот если заходим изменить Equals то должны перегрузить функцию получения хеш кодов. Короче взаимосвязанные они. Смотрим пример:
using System; class MyClass { public override int GetHashCode() { return x1+x2+x3; } public override bool Equals(object obj) { MyClass o = (MyClass) obj; if (o.GetHashCode()==this.GetHashCode()) { if (x1 != o.x1) return false; if (x2 != o.x2) return false; if (x3 != o.x3) return false; return true; } else return false; } public int x1=0; public int x2=0; public int x3=0; } class MainClass { public static void Main(string[] args) { MyClass c1 = new MyClass(); c1.x1=1; c1.x2=1; c1.x3=1; MyClass c2 = new MyClass(); c2.x1=2; c2.x2=2; c2.x3=2; MyClass c3 = new MyClass(); c3.x1=1; c3.x2=1; c3.x3=1; if (c1.Equals(c2)) Console.WriteLine("c1=c2"); if (c1.Equals(c3)) Console.WriteLine("c1=c3"); } }
Я создал свою функцию получения хеш кода. Конечно совсем простую и конечно много вариантов могут получить один и тот же код. Гарантия только одна, что если они не совпадают то классы точно разные. А вот если совпадают нужно еще раз все проверить, чтобы убедиться точно.