La raison de cette différence est simple, voire évidente.
Si vous utilisez l'opérateur d'égalité ==
alors vous utilisez le test d'égalité de l'IEEE.
Si vous utilisez le Equals(object)
vous devez alors gérer le contrat de la méthode object.Equals(object)
. Lorsque vous implémentez cette méthode (et la méthode correspondante GetHashCode
), vous devez maintenir ce contrat, ce qui est différent du comportement de l'IEEE.
Si le Equals
n'était pas respecté, le comportement des tables de hachage serait rompu.
var map = new Dictionary<double,string>();
map[double.NaN] = "NaN";
var s = map[double.NaN];
Si !double.NaN.Equals(double.NaN)
vous ne sortiriez jamais votre valeur du dictionnaire !
Si la phrase précédente n'a pas de sens, comprenez que la mécanique du hachage (utilisée dans Dictionary<T,U>
, HashSet<T>
etc.) utilisent à la fois le object.Equals(object)
y object.GetHashCode()
et s'appuient sur des garanties de leur comportement.