Непонятный результат вычисления

1,00
р.
Почему в данном случае a будет равно 20, а не 21?
int a = 10 a += a++ Console.WriteLine(a)

Ответ
Это вариация классической задачи про ++i + ++i в несколько упрощенном варианте.
В C++ - это undefined behavior, и результатом в большинстве компиляторов будет 21. Цитируя lurkmore:
согласно стандартам С и С++, побочные эффекты (то есть инкремент в данном случае) могут быть применены в любой удобный для компилятора момент между двумя точками следования. Конструкцию i = ++i + ++i компилятор вправе понять и как tmp=i tmp++ i = tmp tmp++ i += tmp и как tmp=i tmp++ tmp++ i = tmp + tmp
Из-за непредсказуемости поведения этот пример раньше часто предлагали объяснить на собеседованиях :)

В C# результатом будет 20, т.к. порядок вычисления явно задан спецификацией. В C# нет никаких точек следования, компилятор не настолько свободен при оптимизации выражений, так что он вычисляет в том порядке, в котором ему приказали:
+= - это compound assignment operator. Он не самостоятельный оператор (не допускает отдельной перегрузки, и т.д.), а просто шорткат для
a = a + a++
Т.е. он просто берет результат вычисления a (10), прибавляет к нему результат вычисления a++ (10) и складывает сумму (20) обратно в a. При этом операнды вычисляются именно слева направо.
Процесс вычисления постфиксного оператора a++ описан в спецификации C#, 7.6.9 Postfix increment and decrement operators, и он следующий:
Сохраняется текущее значение a. (10) Вызывается оператор (++) с передачей сохраненного значения a в качестве аргумента. Результат вычисления оператора (11) сохраняется в a. (которое позже перезатрется результатом сложения) Сохраненное значение a возвращается как результат операции. (10)
Поэтому
a + (a++) -> 20 (a++) + a -> 21