重複の可能性:
パラメータはメソッドに渡されるときに順番に評価されますか?
私が持っていると言う
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によると :
...これらの呼び出しの 2 番目は、引数の順序を逆にしますが、引数は位置ではなく名前でパラメーターと照合されるため、結果は同じです。
あなたの場合、関数宣言で最初に(左から)表示されるように、最初に実行されy
、後に実行されます。x
それが本当に 2 番目のパラメーターのようになるという事実は、名前付きパラメーターを実装する C# コンパイラの実装の詳細です。