可能重复:
传递给方法时是否按顺序评估参数?
说我有
void foo (int x, int y)
并通过以下方式调用它:
foo(y: genNum(), x: genNum())
在这种情况下,C# 是否保证 x 和 y 的评估顺序?
可能重复:
传递给方法时是否按顺序评估参数?
说我有
void foo (int x, int y)
并通过以下方式调用它:
foo(y: genNum(), x: genNum())
在这种情况下,C# 是否保证 x 和 y 的评估顺序?
根据规范,参数总是从左到右进行评估。不幸的是,在 C# 4.0 的某些极端情况下存在一些错误。请参阅 Eric Lippert 的帖子,参数在传递给方法时是否按顺序评估?更多细节。
顺便说一句,这可能是不好的做法。如果要保证计算参数的顺序,请先将结果捕获到局部变量中,然后将结果传递给使用方法,例如:
int capturedY = genNum(); //It is important that Y is generated before X!
int capturedX = genNum();
foo(capturedX, capturedY);
我想不出一个很好的理由不那样做。
这不是答案,只是为了显示副作用。
public void Test()
{
foo(y: genNum(), x: genNum());
}
int X=0;
int genNum()
{
return ++X;
}
void foo(int x, int y)
{
Console.WriteLine(x);
Console.WriteLine(y);
}
输出:
2
1
根据 C# In Depth – Optional Parameters and Named Arguments:
...第二个调用颠倒了参数的顺序,但结果仍然相同,因为参数是按名称而不是位置与参数匹配的。
在您的情况下, first 将被执行y
并且 after x
,因为它首先出现在函数声明中(从左侧开始)。
事实上,它实际上就像第二个参数一样,是实现命名参数的 C# 编译器的实现细节。