Как позвонить оператору ==, чтобы вызвать реализацию ребенка? - PullRequest
1 голос
/ 18 января 2012

У меня есть

public abstract class DataClass
{
    public static bool operator ==(DataClass left, DataClass right)
    {
        return left.Equals(right);
    }
}

и вот что происходит

object left = new DataClass();
object right = new DataClass();
bool expected = true;
bool actual;
actual = ((DataClass)left) == ((DataClass)right);
Assert.AreEqual(expected, actual); // passes
actual = left == right;
Assert.AreEqual(expected, actual); // fails

Как заставить его вызывать правильную реализацию, не приводя ее явно?

Ответы [ 2 ]

8 голосов
/ 18 января 2012

static методы не подвержены полиморфному поведению (то есть они не могут быть переопределены).Требуется приведение.

Для возможного обходного пути см. Этот связанный вопрос: Переопределите статический метод

Скорее всего, вам придется прибегнуть к созданию метода экземпляра или переопределениюEquals вместо.

0 голосов
/ 18 января 2012

Вы не можете сделать это, поскольку операторы являются статическими, и по определению они не могут быть виртуальными / переопределенными.

В тех случаях, когда у меня возникла та же проблема, я заканчивал тем, что переопределял bool Equals(object o) и использовалметод вместо оператора.Если это не вариант, то приведение необходимо.

...