Порядок операндов class и enum(int) при перегрузке операторов в C#

В C++ порядок оценки операндов не указан, что мне нужно знать, когда я пытаюсь перегрузить оператор в C#.

class A{

  public static A operator +(A left, int right){
    left.someVariable += right;
    return left;
  }

  public static A operator +(A left, B right){
    var x = 1<<right; // Just to clarify that it might not be a simple int + int operation
    left.someVariable += x;
    return left;
  }
}
enum B{a=0,b=1,c=2}

var a = new A()+B.a+B.b+B.c;//I want this to be operator+(A,1<<0 + 1<<1 + 1<<2)
var b = (new A()+B.a)+B.b+B.c;//as well as this
var c = ((new A()+B.a)+B.b)+B.c;//and this

Resharper говорит мне, что я могу удалить круглые скобки в var b=... и var c=..., но я не уверен, что это правильно, так как я не уверен, что гарантированно всегда будет вызываться перегруженный оператор +(A,B), а не где-то оценивать это как

var d = new A()+((int)B.a+((int)B.b+(int)B.c)); //operator+(A, 0+1+2)

Обновить

Следующее взято из спецификации языка C и не подходит для C#, как указано PetSerAl.

Чтение: Приоритет и порядок оценки Я почти уверен a,b,c не обязательно оцениваются слева направо.

Направление вычисления не влияет на результаты выражений, содержащих более одного оператора умножения (*), сложения (+) или двоично-битового (& | ^) оператора на одном уровне. Порядок операций не определяется языком. Компилятор может вычислять такие выражения в любом порядке, если компилятор может гарантировать непротиворечивый результат.


person Kevin Streicher    schedule 28.09.2017    source источник
comment
В C# + оставили ассоциативность, поэтому a+b+c эквивалентно (a+b)+c. Но, ИМХО, важнее: операторы не должны вносить видимых изменений в аргументы.   -  person user4003407    schedule 28.09.2017
comment
@PetSerAl, но разве в цитируемом тексте с сайта msdna прямо не говорится, что это не относится к более чем одному оператору сложения на одном уровне?   -  person Kevin Streicher    schedule 28.09.2017
comment
Эта цитата из C языка, но не из C#.   -  person user4003407    schedule 28.09.2017
comment
@PetSerAl иногда я чувствую себя просто глупо. Я это читал - но не обрабатывал. Если вы опубликуете это как ответ, я приму это.   -  person Kevin Streicher    schedule 29.09.2017


Ответы (1)


Из окончательного проекта ECMA, второе издание

Когда операнд встречается между двумя операторами с одинаковым приоритетом, ассоциативность операторов управляет порядком, в котором выполняются операции: выполняются слева направо.

x + y + z

оценивается как

(x + y) + z.

  • Операторы присваивания, оператор объединения null и условный оператор (?:) являются правоассоциативными, что означает, что операции выполняются справа налево.

x = y = z

оценивается как

x =(y= z).

Приоритет и ассоциативность можно контролировать с помощью круглых скобок.

x + y * z

сначала умножает y на z, а затем прибавляет результат к x, но

(x + y) * z

сначала складывает x и y, а затем умножает результат на z.

person Kevin Streicher    schedule 29.09.2017