Reputation: 82337
Are parameters evaluated in order when they passed into a method?
For Java it's always true, for C it isn't, but what is the answer for C#?
Sample
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++];
}
This sample works, but is it only luck or a rule?
Upvotes: 45
Views: 9047
Reputation: 660289
As others have pointed out, the language specification requires that parameters be evaluated in left-to-right order.
However, full disclosure, we accidentally and not on purpose introduced a couple of bugs in C# 4.0 where certain scenarios involving named arguments, optional parameters and ref-omitted parameters in calls to legacy COM objects, such that in those scenarios the side effects of arguments might not be evaluated in strictly left-to-right order. The analyzer that deals with the interactions between those features is complicated and it had some bugs.
I apologize for the errors; we hope to have them fixed in the next version.
Upvotes: 31
Reputation: 613262
From the language specification:
During the run-time processing of a function member invocation, the expressions or variable references of an argument list are evaluated in order, from left to right.
Upvotes: 3
Reputation: 217341
Yes, expressions passed as arguments to methods are always evaluated from left to right.
From the C# 4.0 Language Specification:
7.5.1.2 Run-time evaluation of argument lists
During the run-time processing of a function member invocation (§7.5.4), the expressions or variable references of an argument list are evaluated in order, from left to right, [...]
Upvotes: 54