Me golpeó una extraña "asimetría" en C# que realmente no entiendo. Consulte el siguiente código:Object.Equals es virtual, pero Object.operator == no lo usa en 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");
}
}
}
Puede ser obvio para todos los gurús de .NET, pero la segunda afirmación falla.
En Java, he aprendido que == es un sinónimo de algo llamado Object.ReferenceEquals aquí. En C#, pensé que Object.operator == usa Object.Equals, que es virtual, por lo que se reemplaza en la clase System.String.
¿Alguien puede explicar por qué la segunda afirmación falla en C#? ¿Cuáles de mis suposiciones son malas?
Encontré una [respuesta] (http://stackoverflow.com/questions/1766492/c-overloading-operator-versus-equals/1849288#1849288) a mi pregunta también en otro hilo. Parece que 'object.operator ==' usa 'object.ReferenceEquals', pero' string.operator == 'usa' object.Equals'. Esto es contrario a la intuición para mí, porque 'object.Equals' es virtual, por lo que podría usarse ya en' object.operator == '. – wigy