1

重複の可能性:
ネストされたローカル スコープで重複した変数名を宣言できないのはなぜですか?

次のコードがコンパイルされていないことに気付きました。thing簡単な修正は、外部変数を別のものにリコールすることでしたが、内部スコープはループ内で終了する必要があると考え始めました。foreach内部変数を外部で使用することはできません。

thingループ外で名前を再利用できるようにすべきではありませんか? なんで?

String aggregate = String.Empty;
foreach (Thing thing in things)
  aggregate += thing.Value;

Thing thing = new Thing();
4

2 に答える 2

6

ループの外で名前を再利用できるようにすべきではありませんか?なんで?

問題は、最後の行の変数のスコープが上に拡張されることです...それはブロック全体をカバーします。したがって、問題は、ループthingの変数を宣言できないことです。これは、すでにスコープ内にある別の変数と衝突するためです。

C#4仕様のセクション8.5.1から:

local-variable-declarationで宣言されたローカル変数のスコープは、宣言が発生するブロックです。ローカル変数のlocal-variable-declarationの前にあるテキスト位置でローカル変数を参照するのはエラーです。ローカル変数のスコープ内で、同じ名前の別のローカル変数または定数を宣言することはコンパイル時エラーです。

その最後の文は、コードが違反している文です。

別の名前を使用してください。

于 2012-10-18T17:21:04.103 に答える
0

実際、驚くかもしれませんが、変数のスコープは予想よりも広くなっています。このコードを試してみてください。

String aggregate = String.Empty;
foreach (Thing thing in things)
  aggregate += thing.Value;
foreach (Thing thing in things)
  aggregate += thing.Value;

それはうまくコンパイルされます。ただし、先ほどのようにthingoutside を宣言すると、宣言範囲はoutsidesになります。いつか、私も気になります。:)

于 2012-10-18T17:28:57.910 に答える