2016-03-29 12 views
0

私は、このクラスの値のセマンティクスが(すみません)ひどいことを知っている次のコードIEquatable <T>の2つの等しいインスタンスが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; 

を考えてみましょう。私は通常、IEquatable<T>の実装のC#のガイドラインに従います。このガイドラインでは、object.Equals(object obj)もオーバーライドする必要があります。これはちょうど推測です。

と B ので、私はEqualsを呼び出すときに、なぜ、それがobject.Equals(object obj)、というよりもIEquatable<Rectangle>.Equals(Rectangle other)を呼び出しているIEquatable<Rectangle>、として宣言されていますか?

それは、IEquatable<T>実装object実装を使用するには少し奇妙に思える

答えて

4

(再び、私は...私はクラスのデフォルトEquals(object obj)実装をオーバーライドする必要があります知っているこれは、この問題が発生した理由として、単に憶測です)方法を考えてみましょう:

public bool Equals(Rectangle other) 

まだあなたはそれをRectangleを渡していない、あなたはそれをIEquatable<Rectangle>を渡しているので、コンパイラはその方法を選択しません。代わりに基本参照比較を行うSystem.Objectから継承したものを選択します。

基本的に、矩形を別の矩形と比較できるようにした後、矩形と比較できる他の矩形と比較するように頼んでください。コンパイラは、に適用される唯一のタイプがの長方形であると推論できません。

+0

「IEquatable 」に渡す理由がわからないので、「do not do」と言う以外に、コードの修正方法を教えてもらえません。 –

関連する問題