2016-03-29 22 views
0

Betrachten Sie den folgenden CodeWarum geben zwei gleiche Instanzen von IEquatable <T> false zurück?

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; 

Ich weiß, dass der Wert Semantik dieser Klasse sind schrecklich (sorry). Normalerweise befolge ich die C# -Richtlinien für IEquatable<T> Implementierung, die besagt, dass object.Equals(object obj) auch überschrieben werden muss. - Das ist nur Spekulation.

Seit ein und b als IEquatable<Rectangle> erklärt, warum, wenn ich Equals nennen, es ist object.Equals(object obj) Aufruf, anstatt IEquatable<Rectangle>.Equals(Rectangle other)?

Es scheint ein wenig seltsam die object Implementierung über die IEquatable<T> Umsetzung zu verwenden (wieder, ich weiß, ich soll die Klassen Standard Equals(object obj) Implementierung außer Kraft setzen ... das ist nur Spekulation, warum dies geschieht)

Antwort

4

betrachten Sie die Methode:

public bool Equals(Rectangle other) 

noch sind Sie nicht eine Rectangle vorbei, du bist es vorbei ein IEquatable<Rectangle>, so wird der Compiler nicht diese Methode wählen. Stattdessen wählt es den von System.Object übernommenen, der einen grundlegenden Referenzvergleich durchführt.

Im Grunde genommen haben Sie das Rechteck in die Lage versetzt, sich mit einem anderen Rechteck zu vergleichen und es dann mit etwas anderem zu vergleichen, das sich mit einem Rechteck vergleichen kann. Der Compiler kann und kann nicht schließen, dass der einzige Typ, der auf zutrifft, ein Rechteck ist.

+0

Da ich nicht verstehe, warum Sie es übergeben würden IEquatable 'zu Beginn mit kann ich Ihnen nicht sagen, wie Sie den Code zu beheben, außer zu sagen" do not do ". –