Почему перегрузки операторов C # должны быть статическими? - PullRequest
21 голосов
/ 07 января 2010

Почему C # требует, чтобы перегрузки операторов были статическими методами, а не функциями-членами (такими как C ++)? (Возможно, более конкретно: какова была мотивация дизайна для этого решения?)

Ответы [ 3 ]

32 голосов
/ 07 января 2010

Ответил с мучительной подробностью здесь:

http://blogs.msdn.com/ericlippert/archive/2007/05/14/why-are-overloaded-operators-always-static-in-c.aspx

Существует также еще одна тонкость в отношении типов значений и операторов экземпляров. Статические операторы делают возможным такой код:

class Blah {

    int m_iVal;

    public static Blah operator+ (Blah l, int intVal)
    {
        if(l == null)
            l = new Blah();
        l.m_iVal += intVal;
        return l;
    }
}

//main
Blah b = null;
b = b + 5;

Таким образом, вы можете вызвать оператор, даже если ссылка нулевая. Это не относится к операторам экземпляра.

27 голосов
/ 07 января 2010

Взгляните на этот пост .

Пара причин, по-видимому, в первую очередь для сохранения симметрии оператора (так, чтобы левая часть бинарной операции не получала особой обработки, как отвечающая за отправку операции).

0 голосов
/ 24 сентября 2010

Возможно, лучше подумать, почему методы не должны быть статичными. Нет необходимости в государстве и, следовательно, в этом.

...