0

我有一个名为Employee. 现在我尝试定义它的Equals方法,但我只想接受一个Employeeas 参数。

所以我写了这段代码:

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

我有一个名为 Employee 的类。现在我尝试定义它的 Equals 方法,但我只想接受一个 Employee 作为参数。

那么你不是压倒一切,你是重载。这意味着任何想要调用您的代码的东西要么必须根据参数的执行时类型动态地执行它,要么必须提前知道您的重载并考虑到它。

Employee如果您进行实施,后者是可行的IEquatable<Employee>(并且您仍然应该覆盖GetHashCode,并且理想情况下应该覆盖Equals(object)以保持理智) - 那么任何使用的东西EqualityComparer<T>.Default最终都会使用您的方法。那将包括Dictionary<,>等。

但基本上,任何期望能够调用的东西Equals(object)都会得到继承的实现,因为你没有覆盖它。C# 根本不会在执行时执行重载决议,除非您对类型使用动态dynamic类型 - 这在其他方面具有重大影响,尤其是性能。

你有两个选择,真的:

  • 使用具有不同规则的动态语言
  • 遵循 C# 的规则,其中方法签名是在编译时选择的,但该方法签名的实现是多态地确定为执行时间
于 2012-09-28T06:12:50.217 回答
0

您没有得到您期望的结果,因为您调用了不同的Equals方法))) 您调用了类object的方法,它是 C# 中所有类的父类,但是您期望您将调用 Employee 类的 Equals 方法。要调用 Employee 类的 Equals 方法,您应该使用Employee实例:

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