В
FxCop есть такое правило
Override GetHashCode on overriding Equals, переопределяйте
GetHashCode переопределяя
Equals. Так вот с этим правилом связан подводный камень. В Rule Description там написано об этом но как на мой взгляд не совсем ясно.
Это связано с
принципом работы
HashTable и
Dictionary в .NET, и для того чтобы сравнение производилось верно при переопределении
Equals необходимо обязательно переопределить
GetHashCode в зависимости от тех данных которые учувствуют в сравнении. Иначе
Equals просто не будет вызван, хотя многие разработчики ожидают что он будет вызыватся всегда.
Equals вызывается только тогда когда
GetHashCode возвращает одинаковые значения, что как было сказано выше, связано с принципом работы словарей и хеш-таблиц, для того чтобы разрешить коллизии в хеш-таблице.
С другой стороны на такие неправильные выводы вполне возможно наталкивает поведение
System.Object метод
GetHashCode которого возвращает значения, которые не зависят от данных хранящихся в объекте и возвращает разные хеш-коды для одинаковых объектов.
И хотя такое поведение казалось бы, мелочь, но часто многие в свое время натыкаются на этот подводный камень.