Операторы над своими типами в C#
Числа и строки давно участвуют в коротких выражениях: складывают, сравнивают, берут элемент по номеру. Для своего класса ту же привычную запись оставляют, когда операция имеет ясный смысл для всех объектов этого типа.
Так код читается как предметная задача, а не как цепочка вызовов методов с длинными именами. Сложение двух векторов, сравнение двух версий или доступ к ячейке внутри обертки над массивом - типичные случаи, где знак в выражении уместен.
Перегрузку имеет смысл вводить там, где знак однозначно описывает действие над полями объекта и не путает читателя. Если правило спорное или зависит от контекста программы, лучше оставить обычный метод с говорящим именем.
Исходные операнды чаще не меняют: сложение
и сравнение возвращают новый результат или
bool, а не переписывают левый объект.
Так же устроены многие операции над встроенными типами,
и для своих классов разумно сохранять это ожидание.