Было бы намного проще и не так подвержено ошибкам, если вы напишите вместо
for (int i = 0; i < attach_num; i++)
следующее
for (int i = 0; i < attach.Length; i++)
Свойство Length возвращает количество элементов вданный массив.По какой причине вы используете attach_num
?
Другой подход заключается в том, что вы увеличиваете int в цикле foreach и используете переменную для доступа к массиву, например:
int[] int_array = new int[] { 1, 2, 3, 4, 5 };
int i = 0;
foreach (int item in int_array)
{
i++;
if (i == 2)
{
int_array[i] = 7;
}
}