Наследуемые типы обычно не должны реализовывать IEquatable<T>
. Если IEquatable<T>
включает метод GetHashCode()
, можно определить семантику IEquatable<T>
, чтобы сказать, что элементы должны сравниваться одинаково при рассмотрении как T. К сожалению, тот факт, что IEquatable<T>
привязан к тому же хеш-коду, что и Object.Equals
, означает, что в общем случае IEquatable<T>
должен реализовывать по существу ту же семантику, что и Object.Equals
.
Следовательно, если реализация IEquatable<BaseClass>
делает что-либо кроме вызова Object.Equals
внутри него, производный класс, который переопределяет Object.Equals
и GetHashCode()
и не повторно реализует IEquatable<BaseClass>
, в результате будет поврежден реализация этого интерфейса; реализация IEquatable<BaseClass>
, которая просто вызывает Object.Equals
, будет отлично работать, даже в этом сценарии, но не даст реального преимущества перед классом, который не реализует IEquatable<T>
.
Учитывая, что наследуемые классы не должны реализовывать IEquatable<T>
, во-первых, понятие ковариации не имеет отношения к надлежащим реализациям интерфейса.