ddd329, справедливости ради, у него есть достаточно специфические советы в книге (например использовать System.String / System.In32 вместо алиасов), да и сама книга достаточно старая.
freeExec прав. Не нужно принимать решение по принципу "все так делают". Нужно сначала разобраться, почему так делают. Вариант из доки допустимый, но не для каждой задачи он будет допустим.
Василий Банников, Да, у него есть советы, которыми я пренебрегаю, например описанный вами. Но он объясняет свою точку зрения и это заставляет задуматься, но это вовсе не ерунда.
А вот про принцип "все так делают" нигде мною не было сказано. Товарищ написал "похоже", т.е. ему кажется, но это не факт как вы понимаете. Не утверждайте то, чего не знаете.
В данном случае реализация корректная, но она может повести себя некорректно, если создавать наследника ImaginaryNumber.
Так что по-хорошему надо проверять и типы через GetType, что вы и заметили.
GetHashCode кстати сейчас рекомендуется реализовывать через структуру HashCode
freeExec, если у базового класса два свойства, а у производного класса пять свойств (три добавилось), то как они могут быть равны? Например, два объекта obj1 и obj2, первый имеет базовый класс, а второй производный класс, то если вызвать obj1.Equals(obj2), то если первые два свойства будут одинаковы, то объекты равны, но это неверно, т.к. у obj2 ещё три дополнительных свойства. Понимаете?
Если вы сравниваете два массива, один длиной 10, а другой 12, то если во втором массиве первые 10 элементов совпадают с первым массивом, то разве они равны? Нет конечно.
ddd329, смотря как сравнивать.
Если массив длиной 12 можно было бы привести к массиву длиной 10, то в принципе они равны - тот, кто будет потреблять первые 10 элементов массива не увидит между ними разницы.
Equals не обязан быть симметричным.
ddd329, Я не понял, что вы имеете ввиду.
Вот у меня есть класс - поле для игры в крестики-нолики. И там три свойства: строка, столбец, и признак что в поле проставлено. И вот в Equals я сравниваю только этот признак: Х и Х -> значит равны, и мне всё равно на координаты клетки. Хоть двадцать раз отнаследуйся, добавь туда, ну я не знаю, скин для отображения Х, от этого их равенство в моей программе не поменяется.