Подтвердить что ты не робот

Проверяются ли параметры в порядке, когда они передаются в метод?

Проверяются ли параметры в порядке их прохождения в метод?

Для Java это всегда верно, для C это не так, но каков ответ для С#?

Пример

string.Format("byte1={0} byte2={1} byte3={2}", 
  getNextByte(), 
  getNextByte(), 
  getNextByte());

int pos=0;
byte[] arr=new byte[] {1,2,3,4,5,6};
byte getNextByte()
{
  return arr[pos++];  
}

Этот пример работает, но это только удача или правило?

4b9b3361

Ответ 1

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

Из спецификации языка С# 4.0:

7.5.1.2 Оценка времени выполнения списков аргументов

Во время обработки вызова функции-члена (§7.5.4) выражения или ссылки переменных списка аргументов оцениваются в порядке, слева направо, [...]

Ответ 2

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

Однако, полное раскрытие, мы случайно и не намеренно вводили пару ошибок в С# 4.0, где некоторые сценарии, включающие именованные аргументы, необязательные параметры и ref-опущенные параметры в вызовах устаревших COM-объектов, так что в этих сценариях сторона эффекты аргументов могут не оцениваться строго в порядке слева направо. Анализатор, который имеет дело с взаимодействием между этими функциями, является сложным и имеет некоторые ошибки.

Извиняюсь за ошибки; мы надеемся, что они будут исправлены в следующей версии.

Ответ 3

Из спецификации языка:

Во время обработки вызова функции-члена выражения выражения или ссылки переменных списка аргументов оцениваются по порядку слева направо.