2016-04-01 12 views
1

最近、Equalsメソッドをオーバーライドして遊ぶことにしました。私は主にMSDNのガイドライン(私が信じる最新のもの)を使用しました。だから私の実装はこのように終わる:無限ループをオーバーライドで再現する

public class EqualityCheck 
{ 
    public int Age { get; set; } 
    public string Name { get; set; } 
    public DateTime DateOfBirth { get; set; } 

    public override bool Equals(object obj) 
    { 
     if (null == obj) 
     { 
      return false; 
     } 

     //If obj is on of the expected type return false 
     EqualityCheck ec = obj as EqualityCheck; 
     if (null == ec) 
     { 
      return false; 
     } 

     //return true if the fields match. This is the place where we can decide what combination should be unique 
     return (Age == ec.Age) && (Name == ec.Name) && (DateOfBirth == ec.DateOfBirth); 

    } 

    public bool Equals(EqualityCheck ec) 
    { 
     // If parameter is null return false: 
     if (ec == null) 
     { 
      return false; 
     } 

     // Return true if the fields match: 
     return (Age == ec.Age) && (Name == ec.Name); 
    } 
    //How to implement GetHashCode for complex object?  
} 

そしてまた1つのクラス:

public class EqualityCheckChild : EqualityCheck 
{ 
    public int Height { get; set; } 

    public override bool Equals(System.Object obj) 
    { 
     // If parameter cannot be cast to ThreeDPoint return false: 
     EqualityCheckChild ec1 = obj as EqualityCheckChild; 
     if (ec1 == null) 
     { 
      return false; 
     } 

     // Return true if the fields match: 
     return base.Equals(obj) && Height == ec1.Height; 
    } 

    public bool Equals(EqualityCheckChild ec1) 
    { 
     // Return true if the fields match: 
     return base.Equals((EqualityCheck)ec1) && Height == ec1.Height; 
    } 
    public static bool operator ==(EqualityCheckChild a, EqualityCheckChild b) 
    { 
     if (Equals(a, b)) 
     { 
      return true; 
     } 

     if (a == null || b == null) 
     { 
      return false; 
     } 

     return a.DateOfBirth == b.DateOfBirth && a.Name == b.Name; 
    } 

    public static bool operator !=(EqualityCheckChild a, EqualityCheckChild b) 
    { 
     return !(a == b); 
    } 
} 

私は、これは単に削除キャストで、MSDNの実装として示したものですね。

VS2015.NET 4.5.2を使用しています。 VSはキャスティングを冗長とマークしました。そのときに私はこの問題を調べます。私は可能な無限ループについて読んできましたが、私は上記のコードで再作成することにしました。しかし私はそれを再現することはできません。

これはコピー貼り付けコードではないためです。少なくとも文字通りではない。私は自分が何をしているのかを理解しようと手で書きましたので、これにつながる元のコードといくつかの不一致があると思います。しかし、まだ私の質問は残っています - どのようにMSDNの記事にも記載されている問題を再現するには?

答えて

1

EqualityCheckChildのインスタンスをnullと比較しようとしました。

EqualityCheckChild foo = new EqualityCheckChild(); 
Console.WriteLine(foo == null); 

このコードスニペットは、理由operator==方法では、if (a == null || b == null)通話自体をStackOverflowExceptionがの原因となります。

+0

ありがとうございます。本当に無限ループにつながります。 'Equals'を呼び出すことでこのような状況に陥る方法はありますか? – Leron