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によると :

...これらの呼び出しの 2 番目は、引数の順序を逆にしますが、引数は位置ではなく名前でパラメーターと照合されるため、結果は同じです。

あなたの場合、関数宣言で最初に(左から)表示されるように、最初に実行されy、後に実行されます。x

それが本当に 2 番目のパラメーターのようになるという事実は、名前付きパラメーターを実装する C# コンパイラの実装の詳細です。

于 2012-08-27T19:40:25.990 に答える