jeb
jeb

Reputation: 82337

Are parameters evaluated in order when passed into a method?

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

Answers (3)

Eric Lippert
Eric Lippert

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

David Heffernan
David Heffernan

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

dtb
dtb

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

Related Questions