Простой способ перегрузки составного оператора присваивания в C #? - PullRequest
6 голосов
/ 20 мая 2010

У кого-нибудь есть очень простой пример того, как перегрузить составной оператор присваивания в C #?

Ответы [ 3 ]

12 голосов
/ 20 мая 2010

Вы не можете явно перегрузить составные операторы присваивания. Однако вы можете перегрузить оператор main, и компилятор его расширит.

x += 1 - это чисто синтаксический сахар для x = x + 1, и последний - то, на что он будет переведен. Если вы перегрузите оператор +, он будет вызван.

Руководство по перегрузке MSDN-оператора

public static Complex operator +(Complex c1, Complex c2) 
{
   return new Complex(c1.real + c2.real, c1.imaginary + c2.imaginary);
}
4 голосов
/ 03 марта 2011

Согласно спецификации C #, + = отсутствует в списке перегружаемых операторов. Я предполагаю, что это потому, что это также оператор присваивания, который не может быть перегружен. Однако, в отличие от приведенных здесь других ответов, «x + = 1» означает , а не , то же самое , что и «x = x + 1». Спецификация C #, «7.17.2 Составное присваивание» очень ясно говорит об этом:

... the operation is evaluated as x = x op y, except that x is evaluated only once

Важной частью является последняя часть: x оценивается только один раз. Так в таких ситуациях:

A[B()] = A[B()] + 1; 

это может (и делает) иметь значение, как сформулировать ваше утверждение. Но я предполагаю, что в большинстве ситуаций разница будет незначительной. (Даже если я только что столкнулся с тем, где его нет.)

Поэтому ответ на вопрос таков: нельзя переопределить оператор + =. В ситуациях, когда намерение реализуемо с помощью простых бинарных операторов, можно переопределить оператор + и получить аналогичную цель.

2 голосов
/ 20 мая 2010

Вы не можете перегрузить эти операторы в C #.

...