繁体   English   中英

Object.Equals是虚拟的,但是Object.operator ==不在C#中使用它吗?

[英]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.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM