In genere i tipi ereditabili non implementano IEquatable<T>
. Se IEquatable<T>
includeva un metodo GetHashCode()
, si poteva definire la semantica di IEquatable<T>
per dire che gli articoli dovrebbero essere uguali se esaminati come T. Sfortunatamente, il fatto che IEquatable<T>
sia associato allo stesso codice hash di Object.Equals
significa che in generale IEquatable<T>
deve implementare essenzialmente la stessa semantica di Object.Equals
.
conseguenza, se un'implementazione di IEquatable<BaseClass>
fa altro che chiamata Object.Equals
al suo interno, una classe derivata che prevale Object.Equals
e GetHashCode()
e non ri-implementare IEquatable<BaseClass>
finirà con un'implementazione rotto di tale interfaccia; un'implementazione di IEquatable<BaseClass>
che chiama semplicemente Object.Equals
funzionerà correttamente, anche in tale scenario, ma non offrirà alcun vantaggio reale rispetto a una classe che non implementa IEquatable<T>
.
Dato che le classi ereditabili non dovrebbero implementare IEquatable<T>
in primo luogo, la nozione di covarianza non è rilevante per le corrette implementazioni dell'interfaccia.
I problemi menzionati nel filo [Qualora 'IEquatable' '' IComparable essere implementato su rami 'sealed'?] (Http://stackoverflow.com/questions/1868316/should-iequatablet-icomparablet- essere implementato su classi non sigillate) diventerebbe molto peggio se 'IEquatable <>' fosse controverso. –