Object.Equals является виртуальным, но Object.operator == не использует его в 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 #? Какое из моих предположений неверно?

5
задан wigy 18 September 2010 в 07:04
поделиться