В 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 не обязательно оцениваются слева направо.
Направление вычисления не влияет на результаты выражений, содержащих более одного оператора умножения (*), сложения (+) или двоично-битового (& | ^) оператора на одном уровне. Порядок операций не определяется языком. Компилятор может вычислять такие выражения в любом порядке, если компилятор может гарантировать непротиворечивый результат.
+
оставили ассоциативность, поэтомуa+b+c
эквивалентно(a+b)+c
. Но, ИМХО, важнее: операторы не должны вносить видимых изменений в аргументы. - person user4003407   schedule 28.09.2017C
языка, но не изC#
. - person user4003407   schedule 28.09.2017