簡體   English   中英

Object.Equals是虛擬的,但是Object.operator ==不在C#中使用它嗎?

[英]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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM