これは、.NET フレームワークではなく、C# 言語に対する変更です。したがって、コードが実行される .NET Framework のバージョンに関係なく、C# 5.0 でコンパイルされたコードにのみ影響します。
C#5.0
仕様のセクション 8.8.4 は、この変更が行われたことを明確にしています。具体的には、C# 5.0 仕様の 249 ページに次のように記載されています。
foreach (V v in x) embedded-statement
その後、次のように展開されます。
{
E e = ((C)(x)).GetEnumerator();
try {
while (e.MoveNext()) {
V v = (V)(T)e.Current;
embedded-statement
}
}
finally {
… // Dispose e
}
}
以降:
v を while ループ内に配置することは、embedded-statement で発生する無名関数によってどのようにキャプチャされるかという点で重要です。
C#4.0
仕様に対するこの変更は、C# 4.0 仕様と比較すると明らかです (セクション 8.8.4 で、今回は 247 ページ)。
foreach (V v in x) embedded-statement
その後、次のように展開されます。
{
E e = ((C)(x)).GetEnumerator();
try {
V v;
while (e.MoveNext()) {
v = (V)(T)e.Current;
embedded-statement
}
}
finally {
… // Dispose e
}
}
C# 5.0 の場合と同様に、変数v
はループ内ではなくループ外で宣言されていることに注意してください。
ノート
C# 仕様は、Visual Studio のインストール フォルダーの にありますVC#\Specifications\1033
。これは VS2005、VS2008、VS2010、および VS2012 の場合で、C# 1.2、2.0、3.0、4.0、および 5.0 の仕様にアクセスできます。を検索して、MSDN で仕様を見つけることもできますC# Specification
。