Почему полиморфизм не работает с операторами через типы объектов? - PullRequest
3 голосов
/ 08 мая 2020

Демонстрация кода приведена здесь: 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?

1 Ответ

2 голосов
/ 08 мая 2020

Прежде всего давайте посмотрим на сам класс Object:

enter image description here

Как вы можете видеть, метод Equals имеет на нем ключ virtual, Это означает, что в любом классе, который наследуется от объекта, если вы override этот метод, то даже если ваша переменная object o2 = a2; является объектом typeof, указывающим на новый экземпляр класса A -> этот метод будет вызываться средой выполнения:

public override bool Equals(object other)

С другой стороны, operator == не virtual, его нельзя переопределить, поэтому при обращении к переменной object он всегда будет преобразован в System .Object.ReferenceEquals

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...