Соотвествие: ошибка при обходе Для Каждого + заполнении значения
Ошибка
При обходе коллекции с типом Соотвествие в цикле Для Каждого и изменении Значения на второй итерации цикла получаем ошибку
Внешнее исключение (System.InvalidOperationException): Коллекция была изменена; невозможно выполнить операцию перечисления.}
Воспроизведение ошибки
Коллекция = Новый Соответствие();
Коллекция.вставить("а");
Коллекция.вставить("б");
Для Каждого КЗ Из Коллекция Цикл // <<< ---- ЕГГОГ на втором заходе
Коллекция[КЗ.Ключ] = "а";
КонецЦикла;
Коллекция.Вставить(КЗ.Ключ, "а") - ведет себя точно так же, с такой же ошибкой.
Ожидаемое поведение
- В 1C при таком коде ошибки нету.
- Если
Коллекция = Новый Структурав oscript выполняется без ошибок
Я бы сказал, что это особенность реализации. Ошибку выдает .net он не любит изменения коллекций при обходе. Ну и сама идея делать подобное - сомнительна.
Я приму пулреквест, если таковой будет.
@EvilBeaver ты говорил, что любой эксепшен от System - это дырка, и надо фиксить :)
Я говорил, что TargetInvocationException это дырка и надо фиксить. А скажем OutOfBounds для массива - не дырка, т.к. по сути все, что я могу сделать - это повторить данное сообщение.
В данном случае, это хоть и несоответствие поведению, но minor, поскольку разрешать такое все-таки не стоит и тратить время на попытку обмануть .NET не хочется.
Но, если рыцарь в белых доспехах придет и реализует - я буду рад.
@EvilBeaver, Это только в .NET такая особенность? В других языках вроде проверяется и разделяется: значения словарей меняются без проблем, а вот изменение состава ключей - вызывает как положено ошибку.
Соответствие[Ключ] = Значение
вот это потенциально и изменение состава ключей и изменение значения, т.к. ключ может не существовать.