Параметры оцениваются по порядку при передаче в метод?

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

Для Java это всегда так, для C - нет, но какой ответ для 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++];  
}

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

3 ответа

Решение

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

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

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

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

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

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

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

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

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

Другие вопросы по тегам