2016-03-29 1 views
0

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)

Répondre

4

Considérez la méthode:

public bool Equals(Rectangle other) 

mais vous n'êtes pas passer un Rectangle, vous passez un IEquatable<Rectangle>, de sorte que le compilateur ne pas choisir cette méthode. Au lieu de cela, il choisit celui hérité de System.Object qui fait la comparaison de référence de base. Fondamentalement, vous avez fait le rectangle capable de se comparer à un autre rectangle, puis lui demander de se comparer à quelque chose d'autre qui peut se comparer à un rectangle. Le compilateur ne peut pas et ne peut pas déduire que le seul type auquel cela s'appliquerait à est un rectangle.

+0

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". –