Il motivo della differenza è semplice, se non evidente.
Se si utilizza l'operatore di uguaglianza ==
, si sta utilizzando il test IEEE per l'uguaglianza.
Se si utilizza il metodo Equals(object)
, è necessario mantenere il contratto di object.Equals(object)
. Quando si implementa questo metodo (e il corrispondente metodo GetHashCode
), è necessario mantenere tale contratto, che è diverso dal comportamento IEEE.
Se il contratto Equals
non è stato confermato, il comportamento delle tabelle hash si interrompe.
var map = new Dictionary<double,string>();
map[double.NaN] = "NaN";
var s = map[double.NaN];
Se !double.NaN.Equals(double.NaN)
, non otterresti mai il tuo valore fuori dal dizionario!
Se la frase precedente non ha senso, quindi capire che la meccanica di hashing (utilizzati in Dictionary<T,U>
, HashSet<T>
, ecc) utilizzano sia le object.Equals(object)
e object.GetHashCode()
metodi ampiamente, e contare su garanzie del loro comportamento.
fonte
2013-01-22 13:00:18
Potrebbe essere un commento stupido, ma direi che nel caso 1, si confrontano i valori. E nel caso 2 stai confrontando i riferimenti. – jbl
@jbl No, stai confrontando i valori in entrambi i casi - 'double's non sono riferimenti e non sei nemmeno in boxing da [' System.Double.Equals'] (http://msdn.microsoft.com/ en-us/library/ya2zha7s.aspx) è sovraccarico. –
@spender OMFG Dovrei leggere meglio la domanda! Grazie! –