Uderzyło mnie dziwne "asymetria" w języku C#, którego tak naprawdę nie rozumiem. Zobacz poniższy kod:Object.Equals jest wirtualny, ale Object.operator == nie używa go w języku 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");
}
}
}
Dla wszystkich guru .NET może być oczywiste, ale drugie potwierdzenie nie powiedzie się.
W języku Java dowiedziałem się, że == jest synonimem czegoś o nazwie Object.ReferenceEquals. W języku C#, myślałem, że Object.operator == używa Object.Equals, który jest wirtualny, więc jest overriden w klasie System.String.
Czy ktoś może wyjaśnić, dlaczego drugie stwierdzenie kończy się niepowodzeniem w C#? Które z moich założeń są złe?
Znalazłem odpowiedź (http://stackoverflow.com/questions/1766492/c-overloading-operator-versus-equals/1849288#1849288) na moje pytanie również w innym wątku. Wydaje się, że 'object.operator ==' używa 'object.ReferenceEquals', ale' string.operator == 'używa' object.Equals'. Jest to dla mnie intuicyjne, ponieważ 'object.Equals' jest wirtualne, więc może być już użyte w' object.operator == '. – wigy