0

という名前のクラスがありEmployeeます。今、そのメソッドを定義しようとしていますが、 as パラメーターのみEqualsを受け入れたいと考えています。Employee

だから私はこのコードを書きます:

class MainClass
    {
        public static void Main (string[] args)
        {
            Employee e = new Employee();
            Employee e2 = new Employee();
            Console.WriteLine(Equals(e, e2));
        }

        public static Employee CreateEmployee()
        {
            return new Employee();
        }
    } 

    class Employee
    {
        public int ID;
        public bool Equals (Employee e)
        {
            Console.WriteLine("Compare!");
            return ID == e.ID;
        }
    }

しかし、うまくいきません!コンソール出力:

false

私が期待したものではありません:

Compare!
true

と書かなければいけないようpublic override bool Equals (Object)ですが、なぜですか?C# は、パラメーターの型によって呼び出すメソッドを選択できませんか?

4

3 に答える 3

5

コードを次のように変更してみてください

Console.WriteLine(e.Equals(e2)); 

あなたが持っていたように、Object.Equals Method (Object, Object)を使用していました

于 2012-09-28T06:06:05.277 に答える
4

私は従業員という名前のクラスを持っています。今、その Equals メソッドを定義しようとしていますが、従業員をパラメーターとしてのみ受け入れたいと考えています。

次に、オーバーライドしていません。オーバーロードしています。つまり、コードを呼び出す必要がある場合は、パラメーターの実行時の型に基づいて動的に呼び出す、事前にオーバーロードを認識して考慮に入れる必要があります。

Employee後者は、実装する場合に実行可能ですIEquatable<Employee>(それでもオーバーライドする必要がGetHashCodeあり、理想的には正気のためにオーバーライドする必要があります)。使用するものはすべて、メソッドを使用することになります。などが含まれます。Equals(object)EqualityComparer<T>.DefaultDictionary<,>

ただし、基本的に、呼び出すことができると予想Equals(object)されるものはすべて、継承された実装を取得します。これは、オーバーライドしていないためです。C# は、型で動的型付けを使用していない限り、実行時にオーバーロードの解決を実行しません。dynamicこれは、パフォーマンスだけでなく、他の方法でも大きな影響を与えます。

実際には 2 つのオプションがあります。

  • ルールが異なる動的言語を使用する
  • C# のルールに従います。メソッド シグネチャはコンパイル時に選択されますが、そのメソッド シグネチャの実装は実行時にポリモーフィックに決定されます。
于 2012-09-28T06:12:50.217 に答える
0

異なるEqualsメソッドを呼び出すため、期待どおりの結果が得られません))) C# のすべてのクラスの親クラスであるクラスobjectのメソッドを呼び出しますが、Employee クラスの Equals メソッドを呼び出すことを期待しています。Employee クラスの Equals メソッドを呼び出すには、Employeeインスタンスを使用する必要があります。

Employee e1 = new Employee();
Employee e2 = new Employee();
Console.WriteLine(e1.Equals(e2));
于 2012-09-28T06:14:35.260 に答える