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