C# 参数传递到方法时是否按顺序计算?

C# 参数传递到方法时是否按顺序计算?,c#,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++]; } 这

参数传入方法时是否按顺序求值

对于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++];  
}

这个示例可以工作,但这只是运气还是规则?

是的,作为参数传递给方法的表达式总是从左到右求值

从C#4.0语言规范中:

7.5.1.2参数列表的运行时评估

在函数成员调用(§7.5.4)的运行时处理过程中,参数列表的表达式或变量引用按从左到右的顺序进行计算,,[…]


根据语言规范:

在函数成员调用的运行时处理过程中,参数列表的表达式或变量引用按从左到右的顺序进行计算


正如其他人所指出的,语言规范要求按从左到右的顺序计算参数

然而,在完全公开的情况下,我们无意中在C#4.0中引入了两个bug,其中某些场景在调用遗留COM对象时涉及命名参数、可选参数和ref省略参数,因此在这些场景中,参数的副作用可能不会严格按照从左到右的顺序进行评估。处理这些特性之间交互的分析器很复杂,并且有一些bug


我为错误道歉;我们希望在下一个版本中修复这些问题。

评估”可能比“访问”更准确。顺便说一句,这个问题以前有人问过。@Aasmund:谢谢,我更改了它。不过我想不起来这是否是一个保证。你记得还是有推荐人?尽管在任何情况下都不应该依赖于此:)它在语言规范中;是的,这是一种保证。@leppie:F#编译器依赖于这种行为<代码>将dict.TryGetValue(键)与true、value->匹配…|false,->…编译为
T value=default(T);Tuple Tuple=新的Tuple(dict.TryGetValue(key,out value),value);if(tuple.Item1).
。你认为这也适用于
参数
参数,它们基本上是数组初始化的语法糖吗?根据,它看起来是这样的:表达式以递增的顺序初始化数组元素,从索引为零的元素开始。谢谢,但在我的例子中,我只使用非常简单的参数。我没想到会有problems@jeb:事实上,几乎没有人会看到这些问题,这就是为什么我们没有抓住它们,直到为时已晚才能解决它们。我注意到,一般来说,C#中的所有内容都是按从左到右的顺序进行计算的。如果你感兴趣,请参阅更多关于这个主题的文章。@EricLippert你是我的英雄。断开的博客链接。我想这相当于什么是联系@谢谢你的留言。是的,MSFT一直在移动我的博客档案。最终,我会将所有内容转移到ericlippert.com。