На основании каких правил приоритета [x] .SomeMember оценивается как (a [x]). SomeMember, а не…? - PullRequest
2 голосов
/ 10 февраля 2010

а) Оператор точки (a.x) и оператор индекса (a [x]) имеют одинаковый уровень приоритета. Итак, на основании каких правил приоритета выражение a[x].SomeMember оценивается как (a[x]).SomeMember, а не как (a.SomeMember )[x]?

b) Является ли оператор приведения унарным оператором (и поэтому имеет более низкий приоритет, чем оператор точки), и по этой причине выражение (int)a.x оценивается как (int)(a.x)?

спасибо

Ответы [ 3 ]

2 голосов
/ 10 февраля 2010

Для а)

Из спецификации C #, раздел 7.2.1:

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

  • За исключением операторов присваивания, все бинарные операторы являются левоассоциативными, что означает, что операции выполняются слева направо. Например, x + y + z оценивается как (x + y) + z.
  • Операторы присваивания и условный оператор (? :) являются ассоциативными справа, что означает, что операции выполняются справа налево. Например, x = y = z оценивается как x = (y = z).

Это означает, что в этом случае операторы получат приоритет слева направо.

б) Да, это правильно. Это выражение Cast, описанное в разделе 7.6.6, которое применяется к унарному выражению, а приведение классифицируется с помощью унарных операторов (раздел 7.6) и рассматривается с таким же приоритетом.

1 голос
/ 10 февраля 2010

а) На основании последовательности кода. a = b интерпретируется по-разному b = a по той же причине!

b) Приведение является унарным оператором, как описано здесь . Его специфическое поведение объясняется здесь .

1 голос
/ 10 февраля 2010

а) Приоритет слева направо. При оценке ссылок компилятор переходит слева направо, определяя, какие равные операторы получают приоритет. Поскольку [x] предшествует [x] .SomeMember, на него сначала делается ссылка.

b) Это не унарный оператор, но он имеет тот же приоритет, что и унарный.

Приоритет операторов C #

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...