最近、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の記事にも記載されている問題を再現するには?
ありがとうございます。本当に無限ループにつながります。 'Equals'を呼び出すことでこのような状況に陥る方法はありますか? – Leron