Не следует перегружать == это приводит к неинтуитивному коду.Просто придерживайтесь переопределения Equals (и GetHashCode)
Взято из Оператор перегрузки == против Equals () (ответ Сэмюэля Неффа) * 1005 *
Когда у вас есть выражение
x == y
Метод, который будет использоваться для сравнения переменных x и y, определяется во время компиляции.Это перегрузка оператора.Тип, используемый при объявлении x и y, используется для определения того, какой метод используется для их сравнения.Фактический тип в пределах x и y (т. Е. Реализация подкласса или интерфейса) не имеет значения.Рассмотрим следующее.
object x = "hello"; object y = 'h' + "ello"; // ensure it's a different reference
x == y // evaluates to FALSE
и следующее
string x = "hello"; string y = 'h' + "ello"; // ensure it's a different reference
x == y // evaluates to TRUE
Это демонстрирует, что тип, используемый для объявления переменных x и y, используется для определения, какой метод используется для оценки ==.
Для сравнения, равенство определяется во время выполнения на основе фактического типа в переменной x.Equals - это виртуальный метод объекта, который другие типы могут и могут переопределять.Поэтому следующие два примера оба оценивают как истинные.
object x = "hello"; object y = 'h' + "ello"; // ensure it's a different reference
x.Equals(y) // evaluates to TRUE
и следующие
string x = "hello"; string y = 'h' + "ello"; // ensure it's a different reference
x.Equals(y) // also evaluates to TRUE