传递给方法时是否按顺序评估参数?

jeb*_*jeb 38 c#

参数在传递给方法时是否按顺序进行评估?

对于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++];  
}
Run Code Online (Sandbox Code Playgroud)

这个样本有效,但它只是运气还是规则?

dtb*_*dtb 42

是的,作为方法的参数传递的表达式始终从左到右进行计算.

从C#4.0语言规范:

7.5.1.2参数列表的运行时评估

在函数成员调用(第7.5.4节)的运行时处理期间,参数列表的表达式或变量引用按从左到右的顺序进行评估,[...]

  • 这是语言规范; 所以这是保证. (7认同)
  • @leppie:F#编译器依赖于这种行为.`匹配dict.TryGetValue(key)与true,value - > ... | false,_ - > ...`编译为`T value = default(T); 元组<bool,T> tuple = new Tuple <bool,T>(dict.TryGetValue(key,out value),value); if(tuple.Item1)...`. (2认同)

Eri*_*ert 25

正如其他人所指出的那样,语言规范要求以从左到右的顺序评估参数.

然而,完全公开,我们偶然而非故意在C#4.0中引入了一些错误,其中涉及命名参数,可选参数和ref遗漏参数的某些场景在调用遗留COM对象时,这样在那些场景中参数的副作用可能无法严格按从左到右的顺序进行评估.处理这些功能之间的交互的分析器很复杂,并且存在一些错误.

我为错误道歉; 我们希望在下一个版本中修复它们.

  • 他们现在修好了吗? (2认同)