Параметры оцениваются по порядку при передаче в метод?
Параметры оцениваются по порядку, когда они передаются в метод?
Для 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, таковы, что в этих сценариях возникают побочные эффекты аргументов. может не оцениваться в строгом порядке слева направо. Анализатор, который имеет дело с взаимодействиями между этими функциями, сложен и имеет некоторые ошибки.
Я прошу прощения за ошибки; мы надеемся исправить их в следующей версии.
Из спецификации языка:
Во время обработки вызова члена функции выражения или ссылки на переменные списка аргументов оцениваются по порядку слева направо.