Ответ 1
Это изменение языка С#, а не .NET framework. Поэтому он влияет только на код, скомпилированный под С# 5.0, независимо от версии .NET framework, на которой будет выполняться этот код.
С# 5.0
В разделе 8.8.4 спецификации четко указано, что это изменение было сделано. В частности, на стр. 249 спецификации С# 5.0 указано:
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 важно для того, как оно захваченных любой анонимной функцией, происходящей в погруженное утверждение.
С# 4.0
Это изменение спецификации ясно при сравнении с спецификацией С# 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
}
}
Обратите внимание, что переменная v
объявляется вне цикла, а не внутри, как в С# 5.0.
Примечание
Вы можете найти спецификацию С# в папке установки Visual Studio под VC#\Specifications\1033
. Это относится к VS2005, VS2008, VS2010 и VS2012, предоставляя вам доступ к спецификациям для С# 1.2, 2.0, 3.0, 4.0 и 5.0. Вы также можете найти спецификации в MSDN, выполнив поиск C# Specification
.