Почему C # требует, чтобы перегрузки операторов были статическими методами, а не функциями-членами (такими как C ++)? (Возможно, более конкретно: какова была мотивация дизайна для этого решения?)
Ответил с мучительной подробностью здесь:
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;
Таким образом, вы можете вызвать оператор, даже если ссылка нулевая. Это не относится к операторам экземпляра.
Взгляните на этот пост .
Пара причин, по-видимому, в первую очередь для сохранения симметрии оператора (так, чтобы левая часть бинарной операции не получала особой обработки, как отвечающая за отправку операции).
Возможно, лучше подумать, почему методы не должны быть статичными. Нет необходимости в государстве и, следовательно, в этом.