2012-11-16 7 views
8

Eventuali duplicati:
Is it necessary to override == and != operators when overriding the Equals method? (.NET)Perché l'override == deve avere la precedenza su uguale a?

compilatore C# mi suggerisce che avrei dovuto ignorare uguale a se sovrascrivendo ==, voglio solo sapere perché?

+3

possibile duplicato: http://stackoverflow.com/q/1222035/238902 – Default

+1

@Default in realtà, non penso che sia un duplicato - ma sono collegati. Questo è "quando fornisci ==, dovrei ignorare gli uguali?" (a cui la risposta è generalmente: sì), dove -come l'altro è "quando è uguale a pari, devo fornire ==?" (a cui la risposta è generalmente: no, non proprio) –

risposta

4

Perché altrimenti si avranno due operazioni semanticamente simili potenzialmente con risultati diversi, che significa molta confusione.

Non sono sicuro che il compilatore si fermi o se si tratta solo di un avviso, ma in entrambi i casi è generalmente opportuno assicurarsi che si comportino allo stesso modo.

C'è qualcosa di simile a double.NaN == double.NaN versus double.NaN.Equals(double.NaN).

+0

+1: interessante, non ero a conoscenza di 'double.NaN.Equals (double.NaN) == true'. – Henrik

12

Se si sono ri-definire l'uguaglianza tramite ==, diventa davvero confondendo se == fa qualcosa di molto diverso da .Equals, e .Equals deve essere il ripiego, perché quando il tipo non è noto al momento della compilazione, solo .Equals è a disposizione. Di conseguenza, la definizione di == significa in realtà: definizione di ==, !=, Equals e GetHashCode ed eventualmente implementazione di IEquatable<T> per alcuni T.

+0

+1 Sì, 'double.NaN' pungono quando si sbagliano :-) –

+0

Non è possibile che' == 'e' Equals' si comportino in modo identico in tutte le situazioni, e non penso che dovrebbero . Ciò che sarebbe più utile sarebbe che '==' sia coerente nei luoghi in cui è utilizzabile, e 'Equals' sia coerente ovunque (dato che è utilizzabile ovunque). Una regola secondo cui i tipi numerici che rappresentano lo stesso numero devono confrontare '==', anche se differiscono per altri aspetti, mentre solo le cose che sono equivalenti al 100% devono essere paragonate a "pari", sarebbe IMHO più utile del mishmosh che esiste ora . – supercat

+0

Così com'è, non c'è un modo carino per definire ad es. un dizionario che assocerebbe valori 'Decimal' alle loro rappresentazioni di stringa, perché un dizionario non può distinguere i numeri' 1.0m' e '1.00m' [le cui rappresentazioni di stringa dovrebbero differire]. L'operatore '==' dovrebbe considerare quei valori come uguali, ma ciò non significa che dovrebbe essere uguale a 'Equals'. Inoltre, il modo in cui '==' overloads è definito, spesso non riesce a implementare una relazione di equivalenza e in realtà non verifica l'uguaglianza numerica, poiché ad es. '16777217 == 16777216.0f'. – supercat

1

Perché altrimenti si otterranno risultati diversi a seconda di come si effettua il confronto.

Fare x == y potrebbe dare un risultato diverso da fare y == x (se x e sono diversi tipi). Altri confronti, come cercare il valore in un elenco o utilizzarlo come chiave in un dizionario, non utilizzano l'operatore ==, quindi non funzionerebbe affatto.

+0

Perché potrebbe essere diverso? Cosa deve fare? –

+0

@ MatíasFidemraizer: Poiché 'x == y' userebbe l'operatore' == 'sul valore' x', ma 'y == x' userebbe l'operatore' == 'sul valore' y'. Se sono implementati in modo diverso (ad es.'y' usa il confronto degli oggetti di default) danno risultati diversi. – Guffa

+0

Ah, capisco. Ma succederà se 'x' e' y' hanno tipi diversi. Se entrambi hanno lo stesso tipo, 'x == y' o' y == x' dovrebbe comportarsi nello stesso modo. Forse dovresti metterlo in evidenza nella nostra risposta. –

Problemi correlati