Цикл for ведет себя странно (С# WinForms)

110
06 мая 2021, 18:40

В одном цикле я постоянно получаю System.ArgumentOutOfRangeException:

C#
for(int i=0; i<Answers.Count; i++)
{
    Answers[i].BeginInvoke(new InvokeDelegate(() => { Answers[i].Enabled = false; Answers[i].Visible = false; }));
}

Длина Answers - 6, но при проверке оказалось что i достигает 6! Это же невозможно(или я ошибаюсь)?

Answer 1

Типичная ошибка с захватом переменной. Попробуйте это

for(int i=0; i<Answers.Count; i++)
{
     int j = i;
     Answers[i].BeginInvoke(new InvokeDelegate(() => { Answers[j].Enabled = false; 
           Answers[j].Visible = false; }));
}

Проблема в том, что всё, что внутри этого кода BeginInvoke(....) запускается не сразу, а через какой то промежуток времени. К тому моменту ваш цикл уже закончился и переменная i уже равна Answers.Count.

READ ALSO
Передача массива в параметр SQL

Передача массива в параметр SQL

Возможна ли передача массива в параметр SQL? Если я хочу массово удалить, или проставить статусы списку заказов, как это сделать?

95
C# Шаблоны и Списки

C# Шаблоны и Списки

Есть класс Colum<T>, Есть класс Row со списком List<Colum>И есть проблема, List<Colum> требует указать ещё тип T аки List<Colum<int>>, но мне не нужно...

83
Доступ с Composer, идущим в комплекте с Open Server из Php Storm

Доступ с Composer, идущим в комплекте с Open Server из Php Storm

Я знаю, что Open Server имеет в комплектации консоль, откуда есть доступ к ComposerТем не менее, я бы хотел обойтись без этой консоли и работать с Composer...

89
Поиск всех значений в тексте

Поиск всех значений в тексте

есть текст [a]какой то текст[/a] еще куча какого то текста, [a]какой то текст[/a] есть регулярка /(\[a+\/a\])/ если текст без переноса строки, то находит...

112