Возможный дубликат:
Почему оператор ReferenceEquals и == отличается от Equals
Стандартная реализация оператора == сравнивает объекты по ссылкам. Поэтому, когда вы переопределяете Equals (поведение по умолчанию такое же), вы также должны указывать операторы == и !=, чтобы они вызывали Equals (и делали их в каждом классе иерархии как == и !=) операторы не виртуальный).
Мой вопрос, почему это так? Почему == и != сравнивают объекты по ссылке вместо использования Equals? Наверное, должна быть причина для такой фундаментальной вещи.
Обновить.
К комментариям: Я предположил, что == должен зависеть от Equals (но не наоборот), поскольку вы можете переопределить Equals в базовом классе и автоматически использовать эту реализацию в производных классах. Он не будет работать, если Equals использовал == в своей реализации, поскольку == не является виртуальным.