よくわからない 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 の達人には明らかかもしれませんが、2 番目のアサートは失敗します。
Java では、== はここで Object.ReferenceEquals と呼ばれるものの同義語であることを学びました。C# では、Object.operator== は仮想である Object.Equals を使用すると考えていたため、System.String クラスでオーバーライドされています。
誰かが説明できますか? C# で 2 番目のアサートが失敗するのはなぜですか? 私の仮定のどれが悪いですか?