Почему возникает StackOverflowException при попытке присвоить значение в ячейку при итерации строк в DataTable.Rows?

Возникла проблема. Есть заполненный DataTable. Необходимо изменить одно поле в каждой строке, используя другие поля из этой же строки. Делается это следующим образом:

        foreach (DataRow row in _dataTable.Rows)
        {
            double smuz = Convert.ToDouble(row["smuz"]);
            double smisp = Convert.ToDouble(row["smisp"]);
            row["balance"] = Math.Round(smuz - smisp, 2);
        }

Например, в одном случае исходные данные выглядят следующим образом:

Скриншот сделан из таблицы в базе данных Firebird. По запросу загружаю эти данные в созданный DataTable, у которого структура такая же, как и у таблицы из базы данных. В базе эти три колонки имеют тип Double Precision. Следовательно, все три колонки имеют DataType - System.Double.

Но при попытке сделать задуманное выскакивает интересное исключение - StackOverflowException.

Прошёлся отладчиком и заметил, что при попытке записать значение в колонку balance, цикл foreach начинает выполняться заново. Следовательно, получается, что это бесконечный рекурсивный цикл, который, по неведомой мне причине, ведёт себя именно так.

Пробовал сделать это с помощью классического for:

         for (int i = 0; i < _dataTable.Rows.Count; i++)
         {
             double smuz = Convert.ToDouble(_dataTable.Rows[i]["smuz"]);
             double smisp = Convert.ToDouble(_dataTable.Rows[i]["smisp"]);
             // На следующей строке цикл начинает выполняться заново.
             _dataTable.Rows[i]["balance"] = Convert.ToDouble(smuz - smisp);
         }

Кто-то знает в чём проблема и как её решить?


Ответы (1 шт):

Автор решения: Igor

Хм, я знаю. Этот код находится в (вызывается из) обработчике события, которое срабатывает на изменение значения row["balance"].

→ Ссылка