Tôi bị ảnh hưởng bởi "sự bất đối xứng" lạ trong C# mà tôi không thực sự hiểu. Xem mã sau:Object.Equals là ảo, nhưng Object.operator == không sử dụng nó trong 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");
}
}
}
Điều này có thể hiển nhiên đối với tất cả các bạn .NET gurus, nhưng khẳng định thứ 2 không thành công.
Trong Java tôi đã học được rằng == là một từ đồng nghĩa cho một cái gì đó gọi là Object.ReferenceEquals ở đây. Trong C#, tôi nghĩ rằng Object.operator == sử dụng Object.Equals, là ảo, vì vậy nó được overriden trong lớp System.String.
Ai đó có thể giải thích, tại sao xác nhận thứ 2 thất bại trong C#? Giả định nào của tôi là xấu?
Tôi đã tìm thấy [answer] (http://stackoverflow.com/questions/1766492/c-overloading-operator-versus-equals/1849288#1849288) cho câu hỏi của mình cũng trong một chuỗi khác. Có vẻ như 'object.operator ==' sử dụng 'object.ReferenceEquals', nhưng' string.operator == 'sử dụng' object.Equals'. Điều này phản trực giác với tôi, bởi vì 'object.Equals' là ảo, vì vậy nó có thể được sử dụng trong' object.operator == '. – wigy