[英]Object.Equals is virtual, but Object.operator== does not use it in C#?
我被我不太了解的C#中的一個奇怪的“不對稱”擊中。 請參見以下代碼:
using System;
using System.Diagnostics;
namespace EqualsExperiment
{
class Program
{
static void Main(string[] args)
{
object apple = "apple";
object orange = string.Format("{0}{1}", "ap", "ple");
Console.WriteLine("1");
Debug.Assert(apple.Equals(orange));
Console.WriteLine("2");
Debug.Assert(apple == orange);
Console.WriteLine("3");
}
}
}
對於您所有的.NET專家而言,這可能是顯而易見的,但是第二個斷言失敗。
在Java中,我了解到==是這里稱為Object.ReferenceEquals的同義詞。 在C#中,我認為Object.operator ==使用的是Object.Equals,它是虛擬的,因此在System.String類中將其重寫。
誰能解釋,為什么第二個斷言在C#中失敗? 我的哪個假設是錯誤的?
==
運算符不是同義詞,它是為不同類型定義的運算符。
為字符串定義了==
運算符,然后實際上使用了Equals
方法:
public static bool operator ==(string a, string b) {
return Equals(a, b);
}
但是,在代碼中,您沒有在字符串上使用運算符,而是在對象上使用了運算符,因此得到的是為對象定義的==
運算符,該運算符使用ReferenceEquals
進行比較。
使用哪個運算符重載是在編譯時確定的,所以決定重載的是變量的類型,而不是變量所指向的對象的實際類型。
運算符被定義為靜態方法,因此它們不能參與多態。 因此,您的第二個斷言為object
使用==
的定義(因為您的變量被聲明為object
),該定義僅測試引用的相等性。 如果變量聲明為string
,則==
超載的string
會被使用,而第二斷言會成功。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.