在確切的設定中:
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
問題:if ojb1and obj1are 型別為 NS.A 為什么public bool Equals(A a)不輸入?
是Console.WriteLine(obj1.GetType());關于真實物件型別的“謊言”。我很迷惑?
我想A.Equals(A)從代碼中呼叫方法,即使Object obj1 = new A();
我知道我可以解決這個問題,A obj1 = new A();但我堅持理解為什么GetType()回傳A并且我不能呼叫A.Equals(A).
uj5u.com熱心網友回復:
您需要讓它知道它是覆寫而不是創建新功能。
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 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;
}
}
回傳
A
A
False
enters Equals
True
enters Equals
True
這是有關覆寫的更多資訊。
干杯!
轉載請註明出處,本文鏈接:https://www.uj5u.com/qukuanlian/409440.html
標籤:
