В C # операнды оцениваются слева направо.Всегда всегда всегда слева направо.Поэтому операнды оператора = оцениваются слева направо.В вашем «ожидаемом» примере выражение Pop () происходит в операторе, который выполняется перед оператором выражения Peek ().В вашем «неожиданном» примере выражение Peek () находится слева от выражения Pop (), поэтому оно вычисляется первым.
SLaks ответ отмечает, что получатель вызова всегда оценивается перед аргументами вызова.Это правильно - потому что получатель вызова всегда слева от аргументов!Но SLaks утверждает, что это как-то связано с тем, что это установщик свойств неверен.Вы получите точно такое же поведение, если Value будет полем;выражение, содержащее доступ к полю, находится слева от присваиваемого значения и поэтому вычисляется первым.
Вы упомянули «приоритет», что указывает на то, что вы, вероятно, подписываетесь на совершенно мифическое и совершенно неверное представление о том, что приоритетимеет отношение к порядку исполнения. Это не .Избавьтесь от своей веры в этот миф.Порядок выполнения подвыражений слева направо .Операция операторов выполняется в порядке приоритета.
Например, рассмотрим F () + G () * H ().* имеет более высокий приоритет, чем +.В вашем мифическом мире сначала выполняется операция с более высоким приоритетом, поэтому вычисляется G (), затем H (), затем они умножаются, затем F (), затем добавляются.
Это совершенно и совершенно неверно,Скажи это мне: приоритет не имеет ничего общего с порядком исполнения.Подвыражения вычисляются слева направо, поэтому сначала мы вычисляем F (), затем G (), затем H ().Затем мы вычисляем произведение результата G () и H ().Затем мы вычисляем сумму произведения с результатом F ().То есть это выражение эквивалентно:
temp1 = F();
temp2 = G();
temp3 = H();
temp4 = temp2 * temp3;
result = temp1 + temp4;
Оператор = является оператором, как и любой другой;оператор с низким приоритетом, но оператор.Его операнды оцениваются слева направо, и, поскольку это оператор с низким приоритетом, действие оператора - присваивание - выполняется позже, чем влияние всех других операторов.Эффект оператора и вычисление его операндов - это совершенно разные вещи.Первое сделано в порядке приоритета.Последнее выполняется в порядке слева направо.
Понятно ли это?
ОБНОВЛЕНИЕ: сбивает с толку приоритет, ассоциативность и порядок исполнения;многие авторы книг с многолетним опытом проектирования языков программирования ошибаются.C # имеет очень строгие правила, определяющие каждый;если вас интересует более подробная информация о том, как все это работает, возможно, вас заинтересуют статьи, которые я написал по этому вопросу:
http://blogs.msdn.com/ericlippert/archive/tags/precedence/default.aspx