Проблема, о которой предупреждает Resharper, была решена как в C # 5.0, так и в VB.Net 11.0.Ниже приведены выдержки из языковых спецификаций.Обратите внимание, что спецификации можно найти по следующим путям по умолчанию на компьютере с установленной Visual Studio 2012.
- C: \ Program Files (x86) \ Microsoft Visual Studio 11.0 \ VB \ Specifications \ 1033\ Спецификация языка Visual Basic.docx
- C: \ Program Files (x86) \ Microsoft Visual Studio 11.0 \ VC # \ Спецификации \ 1033 \ Спецификация языка CSharp.docx
C # Language Specification Version 5.0
8.8.4 Оператор foreach
Размещение v внутри цикла while важно для его пониманияперехватывается любой анонимной функцией из встроенного оператора.
Например:
int[] values = { 7, 9, 13 };
Action f = null;
foreach (var value in values)
{
if (f == null) f = () => Console.WriteLine("First value: " + value);
}
f();
Если v объявлено вне цикла while, оно будет разделеносреди всех итераций, и его значение после цикла for будет конечным значением 13, которое будет выводить вызов f.Вместо этого, поскольку каждая итерация имеет свою собственную переменную v, переменная, захваченная f в первой итерации, будет продолжать содержать значение 7, которое будет напечатано.(Примечание: более ранние версии C # объявлялись v вне цикла while.)
Спецификация языка Microsoft Visual Basic Версия 11.0
10.9.3 For Each ... Next Statements (Аннотация)
В версии 10.0 до 11.0 языка произошли небольшие изменения.До 11.0 новая переменная итерации не создавалась для каждой итерации цикла.Это различие наблюдается только в том случае, если переменная итерации захвачена лямбда-выражением или выражением LINQ, которое затем вызывается после цикла.
Dim lambdas As New List(Of Action)
For Each x In {1,2,3}
lambdas.Add(Sub() Console.WriteLine(x)
Next
lambdas(0).Invoke()
lambdas(1).Invoke()
lambdas(2).Invoke()
До Visual Basic 10.0 это приводило кпредупреждение во время компиляции и напечатано «3» три раза.Это было связано с тем, что во всех итерациях цикла использовалась только одна переменная «x», и все три лямбда-выражения захватывали один и тот же «x», и к тому времени, когда лямбда-выражения выполнялись, он имел номер 3. Начиная с Visual Basic11,0, он печатает «1, 2, 3».Это потому, что каждая лямбда захватывает свою переменную "x".