首页 > 解决方案 > 为什么多态性不能通过对象类型对运算符起作用?

问题描述

此处概述了代码演示:https ://dotnetfiddle.net/mCm8Hx

如果我有一个覆盖Equals和运算符的==!=,我可以通过键入为该类的变量来比较它们。

但是,如果我将它们转换为object(或使用类型为分配给该类实例的对象的变量),则该运算符似乎不再被使用。

例如,这会起作用:

var a1 = new MyClass(5);
var a2 = new MyClass(5);
Console.WriteLine(a1 == a2); // prints "true" because I've implemented == operator

这也有效(MySubClass : MyClass):

var b1 = new MySubClass(10);
var b2 = new MySubClass(10);
Console.WriteLine(b1 == b2); // prints "true" because I've implemented == operator in inherited class MyClass

但这不会:

object o1 = a1;
object o2 = a2;
Console.WriteLine(o1 == o2); //prints "false", doesn't use my operator implementation

由于所有类都隐式继承自Object,因此我希望它的工作方式与MySubClass. object为什么类型化变量不是这种情况?

标签: c#polymorphism

解决方案


首先让我们看一下 Object 类本身:

在此处输入图像描述

如您所见,Equals 方法上有virtual键,这意味着在任何从对象继承的类中,如果您override使用该方法,那么即使您的变量object o2 = a2;是指向A类的新实例的 typeof 对象 -> 此方法将由运行:

public override bool Equals(object other)

另一方面operator ==is not virtual,它不能被覆盖,所以当引用object变量时,它总是会解析为System.Object.ReferenceEquals


推荐阅读