[英]Object.Equals is virtual, but Object.operator== does not use it in 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#中失败? 我的哪个假设是错误的?
==
运算符不是同义词,它是为不同类型定义的运算符。
为字符串定义了==
运算符,然后实际上使用了Equals
方法:
public static bool operator ==(string a, string b) {
return Equals(a, b);
}
但是,在代码中,您没有在字符串上使用运算符,而是在对象上使用了运算符,因此得到的是为对象定义的==
运算符,该运算符使用ReferenceEquals
进行比较。
使用哪个运算符重载是在编译时确定的,所以决定重载的是变量的类型,而不是变量所指向的对象的实际类型。
运算符被定义为静态方法,因此它们不能参与多态。 因此,您的第二个断言为object
使用==
的定义(因为您的变量被声明为object
),该定义仅测试引用的相等性。 如果变量声明为string
,则==
超载的string
会被使用,而第二断言会成功。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.