C# 参数传递到方法时是否按顺序计算?
参数传入方法时是否按顺序求值 对于Java来说总是正确的,对于C来说不是,但是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++]; } 这
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。