Сохранение значений переменных в теле делегата

Рейтинг: 0Ответов: 0Опубликовано: 14.08.2023

Возникает проблема при формировании списка делегатов, представляющих собой математические выражения. Помимо параметров функций в формулах должны присутствовать константы, формирующиеся на основе переменной i. Вот простейший пример:

static void Main(string[] args)
{
    List<Func<int>> funcs = new List<Func<int>>();
    for (int i = 0; i < 5; i++)
    {
        funcs.Add(() => { return i; });
    }


    for (int j = 0; j < 3; j++)
    {
        Console.WriteLine(funcs[j]().ToString());
    }
    Console.ReadLine();
}

Вывод:

5
5
5

То есть я заполнил в цикле 5 делегатов. При этом я хотел чтобы они соответствовали таким функциям:

f() = 0
f() = 1
f() = 2
f() = 3
f() = 4

Но вместо этого в делегаты ушла ссылка на переменную i, которая успешно доинкрементировалась в цикле до значения 5 (на чем цикл остановился и перестал выполняться), а последнее значение переменной i = 5 сохранилось во всех делегатах. Поэтому при вызове первых трех делегатов я получил 5, 5, 5, а не 0, 1, 2, как хотел.

Вопрос: каким образом лучше решить задачу сохранения значений внешних параметров в теле делегатов?

Ответы

Ответов пока нет.