不在派生自 Object 的 class 中输入 Equals() 方法

Not entering Equals() method in a class derived from Object

在确切的设置中:

namespace NS
{
    class Program
    {
        static void Main(string[] args)
        {
            Object obj1 = new A();
            Object obj2 = new A();
            Console.WriteLine(obj1.GetType());
            Console.WriteLine(obj2.GetType());

            Console.WriteLine(obj1.Equals(obj2)); // why not entering A::Equals(A a)
            Console.ReadLine();
        }
    }
    class A
    {
        int x;
        public bool Equals(A a)
        {
            Console.WriteLine("enters Equals");
            return this.x == a.x;
        }
    }
}

我有 C# 控制台应用程序的输出:

NS.A
NS.A
False

问题:如果ojb1obj1是NS.A类型,为什么不输入public bool Equals(A a)

Console.WriteLine(obj1.GetType());关于真实对象类型的“谎言”。我很困惑?

我想从代码中调用 A.Equals(A) 方法,尽管 Object obj1 = new A();

我知道我可以用 A obj1 = new A(); 解决问题,但我无法理解为什么 GetType() returns A 而我无法调用 A.Equals(A).

您需要让它知道它正在覆盖而不是创建新函数。

    public override bool Equals(object a)
    {
        Console.WriteLine("enters Equals");
        return ((A)this).x == ((A)a).x;
    } 

您的代码正在创建两个对象 obj1 和 obj2。在询问对象类型时,它返回类型 A,因为它是 obj1 和 obj2 的类型。但是,您在对象变量中包含 obj1 和 obj2。因此,当您调用 obj1.Equals 时,它正在调用 Object 的 Equals 方法。您可以使用 override 命令覆盖它并采用相同的参数,或者您可以明确告诉您的程序您希望它使用 (A) class 方法。

    class Program
    {
        static void Main(string[] args)
        {
            Object obj1 = new A();
            Object obj2 = new A();
            Console.WriteLine(obj1.GetType());
            Console.WriteLine(obj2.GetType());

            Console.WriteLine(obj1.Equals(obj2)); // why not entering A::Equals(A a)
            
            Console.WriteLine(((A)obj1).Equals((A)obj2));
            A a1 = new A();
            A a2 = new A();
            
            Console.WriteLine(a1.Equals(a2));
            
            Console.ReadLine();
        }
    }
    class A
    {
        int x;
        public bool Equals(A a)
        {
            Console.WriteLine("enters Equals");
            return ((A)this).x == ((A)a).x;
        }
    }

returns

A
A
False
enters Equals
True
enters Equals
True

这里是关于 overriding 的更多信息。

干杯!