Это была ошибка дизайна, скопированная с Java, IMO.
В моем идеальном мире:
ToString
будет переименовано ToDebugString
, чтобы правильно установить ожидания Equals
и GetHashCode
исчезнут - Будет
ReferenceEqualityComparer
реализация IEqualityComparer<T>
: в данный момент равная часть этого проста, но нет никакого способа получить«оригинальный» хэш-код, если он переопределен - У объектов не было бы связанных с ними мониторов:
Monitor
будет иметь конструктор, а Enter
/ Exit
и т. д. будут методами экземпляра.
Равенство (и, следовательно, хеширование) вызывают проблемы в иерархиях наследования в целом - при условии, что вы всегда можете указать тип сравнения, который вы хотите использовать (через IEqualityComparer<T>
), и объекты могут сами реализовать IEquatable<T>
, если онихочу, я не понимаю, почему это должно быть на Object
.EqualityComparer<T>.Default
может использовать эталонную реализацию, если T
не реализует IEquatable<T>
, и в противном случае отложить на объекты.Жизнь была бы приятна.
Ах, хорошо.Пока я в этом, ковариация массива была еще одной ошибкой платформы.Если вы хотите языковые ошибки в C #, я могу, если хотите, начать еще одну небольшую разглагольствование;) (Это все еще мой любимый язык, но есть вещи, которые я хотел бы сделать по-другому.)1034 * написал об этом в другом месте, кстати.