Consultez le code suivantPourquoi deux instances égales de IEquatable <T> retournent false?
public class Rectangle : IEquatable<Rectangle>
{
public int Width { get; set; }
public int Height { get; set; }
public bool Equals(Rectangle other)
{
return Width == other.Width
&& Height == other.Height;
}
}
IEquatable<Rectangle> a = new Rectangle() { Width = 10, Height = 20 };
IEquatable<Rectangle> b = new Rectangle() { Width = 10, Height = 20 };
a.Equals(b); // returns false;
Je sais que la sémantique de la valeur de cette classe sont affreux (désolé). Je suis normalement suivre les directives C# pour l'implémentation IEquatable<T>
, qui indique que object.Equals(object obj)
doit également être remplacé. - C'est juste de la spéculation.
Depuis un et b sont déclarés comme IEquatable<Rectangle>
, pourquoi quand je l'appelle Equals
, est-il appelle object.Equals(object obj)
, plutôt que IEquatable<Rectangle>.Equals(Rectangle other)
?
Il semble un peu étrange d'utiliser la mise en œuvre object
sur la mise en œuvre IEquatable<T>
(encore une fois, je sais que je devrais remplacer les classes par défaut Equals(object obj)
mise en œuvre ... c'est juste la spéculation pour expliquer pourquoi cela se produit)
Puisque je ne comprends pas pourquoi vous le passeriez 'IEquatable' pour commencer je ne peux pas vous dire comment réparer le code, autre que de dire "ne fais pas ça". –