私はJavaからC#に移行しています。Bill Wagner の本、Effective C# second edition を読んでいます。私は現在、第1章の項目6「平等のさまざまな概念間の関係を理解する」にいます.40-41-42ページにサンプルコードがあり、Equalsを誤って実装するとエラーが発生する可能性があることを示しています。再現できず、サンプルのエラーのようです。ここに以下のコードがあります
public class B : IEquatable<D>
{
public override bool Equals(object right)
{
//
if (object.ReferenceEquals(right, null))
return false;
// Check reference equality:
if (object.ReferenceEquals(this, right))
return true;
// Problems here, discussed below.
B rightAsB = right as B;
if (rightAsB == null)
return false;
return this.Equals(rightAsB);
}
#region IEquatable<B> Members
public bool Equals(B other)
{
// elided
return true;
}
#endregion
}
Bから継承するクラスD
public class D : B,IEquatable<D>
{
// etc.
public override bool Equals(object right)
{
// check null:
if (object.ReferenceEquals(right, null))
return false;
if (object.ReferenceEquals(this, right))
return true;
// Problems here.
D rightAsD = right as D;
if (rightAsD == null)
return false;
if (base.Equals(rightAsD) == false)
return false;
return this.Equals(rightAsD);
}
#region IEquatable<D> Members
public bool Equals(D other)
{
// elided.
return true; // or false, based on test
}
#endregion
}
本によると、次のコード
B baseObject = new B();
D derivedObject = new D();
// Comparison 1.
if (baseObject.Equals(derivedObject))
Console.WriteLine("Equals");
else
Console.WriteLine("Not Equal");
// Comparison 2.
if (derivedObject.Equals(baseObject))
Console.WriteLine("Equals");
else
Console.WriteLine("Not Equal");
「2 番目の比較は決して true を返しません」、そうです。つまり、D は B のサブクラスであるため、2 番目の比較では B から Equals メソッドが呼び出され、true が返されます。これは完全に理にかなっています。私は何かを逃していますか?