Меня поразила странная «асимметрия» на C#, которую я действительно не понимаю. См. Следующий код:Object.Equals является виртуальным, но Object.operator == не использует его в 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.
Может кто-нибудь объяснить, почему 2-й утверждают неудачу в C#? Какие из моих предположений плохие?
Я нашел [ответ] (http://stackoverflow.com/questions/1766492/c-overloading-operator-versus-equals/1849288#1849288) на мой вопрос и в другом потоке. Кажется, что 'object.operator ==' использует 'object.ReferenceEquals', но' string.operator == 'использует' object.Equals'. Это противоречит интуиции, потому что 'object.Equals' является виртуальным, поэтому его можно использовать уже в' object.operator == '. – wigy