2016-03-29 61 views
0

aşağıdaki koduNeden iki eşit IEquatable <T> örneği yanlış mı döndürüyor?

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; 

Ben bu sınıfın değeri semantik (üzgün) korkunç biliyorum düşünün. Normalde, object.Equals(object obj)'un da geçersiz kılınması gerektiğini bildiren IEquatable<T> uygulaması için C# yönergelerini takip ediyorum. - Bu sadece spekülasyon.

bir ve b beri Equals çağırdığınızda neden bu object.Equals(object obj) yerine IEquatable<Rectangle>.Equals(Rectangle other) çağırıyor IEquatable<Rectangle>, ilan edilir?

O IEquatable<T> uygulanması üzerinde object uygulama kullanmak için biraz garip gelebilir

cevap

4

(yine, ben ... sınıflar varsayılan Equals(object obj) uygulama geçersiz kılmak GEREKEN biliyorum bu Böyle neden olarak sadece bir spekülasyon) yöntemini düşünün: henüz

public bool Equals(Rectangle other) 

bunu bir Rectangle geçen değiliz, bunu bir IEquatable<Rectangle> geçiyoruz, bu yüzden derleyici bu yöntemi tercih olmayacaktır. Bunun yerine, temel referans karşılaştırması yapan System.Object'dan miras alınan birini seçer.

Temel olarak, dikdörtgeni başka bir dikdörtgeni karşılaştırabildiniz, daha sonra kendini bir dikdörtgenle karşılaştırabilecek başka bir şeyle karşılaştırmasını isteyin. Derleyici, bu için geçerli olan tek türün bir dikdörtgeni olduğu sonucuna varamaz.

+0

Neden "IEquatable " ifadesini geçtiğini anlayamadığımdan, "bunu yapma" demeniz dışında kodu nasıl düzeltebileceğimi anlatamam. –