7

可能重复:
传递给方法时是否按顺序评估参数?

说我有

void foo (int x, int y)

并通过以下方式调用它:

foo(y: genNum(), x: genNum())

在这种情况下,C# 是否保证 x 和 y 的评估顺序?

4

3 回答 3

9

根据规范,参数总是从左到右进行评估。不幸的是,在 C# 4.0 的某些极端情况下存在一些错误。请参阅 Eric Lippert 的帖子,参数在传递给方法时是否按顺序评估?更多细节。

顺便说一句,这可能是不好的做法。如果要保证计算参数的顺序,请先将结果捕获到局部变量中,然后将结果传递给使用方法,例如:

int capturedY = genNum(); //It is important that Y is generated before X!
int capturedX = genNum();
foo(capturedX, capturedY);

我想不出一个很好的理由不那样做。

于 2012-08-27T19:32:39.940 回答
2

这不是答案,只是为了显示副作用。

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
于 2012-08-27T19:37:31.467 回答
1

根据 C# In Depth – Optional Parameters and Named Arguments

...第二个调用颠倒了参数的顺序,但结果仍然相同,因为参数是按名称而不是位置与参数匹配的。

在您的情况下, first 将被执行y并且 after x,因为它首先出现在函数声明中(从左侧开始)。

事实上,它实际上就像第二个参数一样,是实现命名参数的 C# 编译器的实现细节。

于 2012-08-27T19:40:25.990 回答