Проверяются ли параметры в порядке, когда они передаются в метод?
Проверяются ли параметры в порядке их прохождения в метод?
Для 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++];
}
Этот пример работает, но это только удача или правило?
Ответы
Ответ 1
Да, выражения, переданные в качестве аргументов в методы, всегда оцениваются слева направо.
Из спецификации языка С# 4.0:
7.5.1.2 Оценка времени выполнения списков аргументов
Во время обработки вызова функции-члена (§7.5.4) выражения или ссылки переменных списка аргументов оцениваются в порядке, слева направо, [...]
Ответ 2
Как указывали другие, спецификация языка требует, чтобы параметры оценивались в порядке слева направо.
Однако, полное раскрытие, мы случайно и не намеренно вводили пару ошибок в С# 4.0, где некоторые сценарии, включающие именованные аргументы, необязательные параметры и ref-опущенные параметры в вызовах устаревших COM-объектов, так что в этих сценариях сторона эффекты аргументов могут не оцениваться строго в порядке слева направо. Анализатор, который имеет дело с взаимодействием между этими функциями, является сложным и имеет некоторые ошибки.
Извиняюсь за ошибки; мы надеемся, что они будут исправлены в следующей версии.
Ответ 3
Из спецификации языка:
Во время обработки вызова функции-члена выражения выражения или ссылки переменных списка аргументов оцениваются по порядку слева направо.