在下面這個例子中,第三個評估返回false,一切正常,但第四個例子返回true ..
我不太明白這是如何工作的,但默認Object.Equals
比較兩個對象的引用平等和看到a
和b
都指向一個字符串的唯一實例,這應該返回false,它在第三個例子中,但不是在第四個例子。
現在我明白了爲什麼在第二個示例中返回true,因爲在字符串類中覆蓋了.Equals()
方法,但在第四個示例中,我們將此字符串作爲對象進行投射。
在這種情況下,它不會叫Object.Equals
?覆蓋等於和類型鑄造
static void Main()
{
// Create two equal but distinct strings
string a = new string(new char[] {'h', 'e', 'l', 'l', 'o'});
string b = new string(new char[] {'h', 'e', 'l', 'l', 'o'});
Console.WriteLine (a == b); // Returns true
Console.WriteLine (a.Equals(b)); // Returns true
// Now let's see what happens with the same tests but
// with variables of type object
object c = a;
object d = b;
Console.WriteLine (c == d); // Returns false
Console.WriteLine (c.Equals(d)); // Returns true
}
對,即使我們將字符串轉換爲對象,它仍然會調用'.Equals'的重寫實現? –
@OverlyExcessive yes;這是多態的關鍵點;重點:像'=='這樣的操作符不是**多態的 –