0

次に、次のクラス宣言を与えます。

   class Employee {
        public string Name { get; set; }
        public int Age { get; set; }

        public override bool Equals(object obj)
        {
            Console.WriteLine("In Equals(Object)");

            if (obj is Employee)
                if (this.Name == (obj as Employee).Name && this.Age == (obj as Employee).Age)
                    return true;
                else
                    return false;
            else
                return false;
        }

        public bool Equals(Employee obj)
        {
            Console.WriteLine("In Equals(Employee)");

            return this.Equals(obj as Object);
        }

        public override int GetHashCode()
        {
            return base.GetHashCode();
        }
    }

Employee.Equals(Employee) を使用しようとしていますが、何らかの理由で機能しません:

    private static void CompareObjects(Object a, Object b)
    {        
        if (a.Equals(b as Employee)) Console.WriteLine("a.Equals(b) returns true");
        else Console.WriteLine("a.Equals(b) returns false");
    }

b を Employee としてキャストしているため、Employee.Equals(Object) よりも署名に一致するため、Employee.Equals(Employee) が呼び出されることを期待していましたが、代わりに後者が呼び出されています。私は何を間違っていますか?

4

2 に答える 2

2

private static void CompareObjects(Object a, Object b)

あなたが使う

a.Equals

ただしa、タイプは Object であるため、Object.Equals() を使用しています。 ではなく、の Equals() メソッドを呼び出していabます。

aとの両方bがタイプであると予想する場合は、次のようにEmployee書くことができます

if (((Employee)a).Equals(b)) Console.WriteLine("a.Equals(b) returns true");

また

if ((a as Employee).Equals(b)) Console.WriteLine("a.Equals(b) returns true");

aただし、どちらのバリアントも、型が従業員ではないという例外をスローします。

代わりに、

Employee aEmployee = a as Employee;
if (aEmployee != null) 
{
    if (aEmployee.Equals(b)) Console.WriteLine("a.Equals(b) returns true");
}

アップデート

オーバーライドすることが意図されている場合、Equals メソッドのシグネチャは正しくありませんObject.Equals(object o)。あなたのメソッドEmployee.Equals(Employee e)はまだ書かれたようには呼び出されません。オーバーライドObject.Equals(object o)したい場合、および従業員ではないものを従業員のものと決して等しくしたくない場合は、次のパターンをお勧めします。

public override bool Equals(object obj)
{
    // If the references are equal, objects must be equal
    if (object.ReferenceEquals(this, obj)) return true;

    Employee other = obj as Employee;

    // obj is not able to be cast to Employee, no need to compare further
    if (other == null) return false;

    // Here, implement the checks you need to compare two 
    // Employee instances for equality
    return this.FirstName == other.FirstName /* && etc. */;
}

のセマンティクスをオーバーライドするときはいつでも、Equals()ほぼ確実にオーバーライドしたいことに注意してくださいGetHashCode()。見る

C# での Equals()、GetHashCode() のオーバーライドを簡素化して保守性を向上

于 2012-07-10T07:04:20.503 に答える
0

条件をここから次のように変更し if (a.Equals(b as Employee))
ます

if ((Employee)a.Equals(b as Employee))
于 2012-07-10T07:12:52.973 に答える