3

Microsoft のドキュメントによると、両方の Equals メソッドは本質的に同じです。しかし、私は非常に奇妙なことに出くわしました。私の Silverlight プロジェクトには、Equals をオーバーライドする同じクラスの 2 つのインスタンスがあります。inst1.Equals(inst2)またはinst2.Equals(inst1)を要求すると、結果として常にtrueになります。しかし、Object.Equals(inst1, inst2)はfalseを返します。これはどのように可能ですか?

何か案は?

ありがとう、ロコ

4

4 に答える 4

6

obj1.Equalsobj1 が でないと仮定しnullます。object.Equals値でも機能しnullます。ただし、それはあなたが見ている動作を説明していません。より良い答えを得るには、それを再現するためのコードを提供する必要があると思います。

于 2010-09-13T15:15:18.227 に答える
3

obj1.Equals はオーバーライドできますが、Object.Equals はオーバーライドできません。つまり、Object.Equals は、オーバーライドしない場合に無料で取得できる Equals メソッドの基本実装です。オーバーライドしたため、2 つの実装は異なり、異なる結果が生じる可能性があります。

于 2010-09-13T15:13:36.170 に答える
1

Object.Equals は、2 つの引数が同じ参照であるかどうか、つまり同じメモリ空間を指しているかどうかをテストすると思います。

MyClass.Equals は異なる実装を持つ場合があり、同じ参照ではない 2 つのクラスが実際には (フィールドとプロパティに基づいて) 等しい場合があります。

于 2010-09-13T15:13:57.823 に答える
0

を適切に実装するように注意してくださいIEquatable<T>。私は次の間違いをしました:

public class SubjectDTO: IEquatable<SubjectDTO>
{
    public string Id;

    public bool Equals(SubjectDTO other)
    {
        return Object.Equals(Id, other.Id);
    }

    public override int GetHashCode()
    {
        return Id == null ? 1 : Id.GetHashCode();
    }
}

大丈夫そうですよね?しかし、試してみると、驚くべき結果が得られます。

var a = new SubjectDTO() { Id = "1"};
var b = new SubjectDTO() { Id = "1"};
Console.WriteLine(Object.Equals(a, b));
Console.WriteLine(a.Equals(b));

False
True

は?まあ、オーバーライドすることが重要ですEquals(object other)

public override bool Equals(object other)
{
    return other == null ? false : Equals(other as SubjectDTO);
}

SubjectDTOクラスに追加すると、期待どおりに機能します。

于 2011-03-07T19:39:27.623 に答える