Ну, вы правильно поняли Эрика и Джона, но вы пропустили одну часть своего кода:
"Hello "+ i++ +" "+v;
^^^
this part increments i for each call
Итак, в основном, что-то похожее на это:
- Captureанонимная функция 3 раза, захватывая ссылки на переменные в методе, а не в области действия цикла
- В конце цикла обе эти переменные имеют значение 3
- Выполнитепервая функция, вывод содержимого
i
и v
, а затем увеличение i
- выполнение второй функции, вывод содержимого
i
и v
, и поскольку это одно и то же i
как и при предыдущем вызове метода, здесь вы получите 4, а не 3 - и т. Д.
Если, с другой стороны, вы изменили свой код, захватив переменные внутриобласть видимости цикла, как это:
for(int v=0,i=0;v<3;v++,i++)
{
int ii = i, vv = v;
funcs.Add( new Func<string>(delegate(){return "Hello "+ ii++ +" "+vv;}) );
}
Тогда вы получите 0, 0
, 1, 1
и 2, 2
.Вы по-прежнему увеличиваете переменную ii
, вы делаете это после использования захваченного значения в цикле, но затем никогда больше не используете эту переменную (каждый анонимный метод получает свою собственную частную копию.) спасибо @ferosekhanj закомментарии