Почему я не могу отредактировать метод, который содержит анонимный метод в отладчике?

Это случилось со мной в Windows с Anaconda. Я исправил это, удалив путь python3 из переменной среды PATH.

15
задан Mihai Limbășan 6 April 2009 в 16:12
поделиться

3 ответа

Да существует очень серьезное основание для того, почему Вы не можете сделать этого. Простая причина стоится. Стоимость активации этой опции в C# (или VB) чрезвычайно высоко.

Редактирование функции лямбды является конкретным случаем класса проблем ENC, которые являются очень трудными решить с текущим ENC (Edit'n'Continue) архитектуру. А именно, это очень трудно к ENC любой метод, который, где ENC делает один из following:-

  1. , Генерирует Метаданные в форме класса
  2. Редактирования или генерирует общий метод

, первым выпуском является больше логического ограничения, но это также врезается в несколько ограничений в архитектуре ENC. А именно, проблема генерирует первый класс, не является ужасно трудным. То, что является надоедливым, генерирует класс после второго редактирования. Механизм ENC должен начать отслеживать таблицу символов для не только живой код, но и сгенерированные классы также. Обычно это не настолько плохо, но это становится все больше трудным, когда форма сгенерированного класса основана на контексте, в котором она используется (как имеет место с лямбдами из-за закрытий). Что еще более важно, как Вы разрешаете различия против экземпляров классов, которые уже живы в процессе?

вторым выпуском является строгое ограничение в CLR архитектура ENC. Нет ничего, что C# (или VB) может сделать для работы вокруг этого.

Лямбды, к сожалению, поражают обе из этих проблем, мертвых на. Короткая версия - то, что ENC'ing, лямбда включает много мутаций на существующих классах (который может или не мог быть сгенерирован от другого ENC's). Большая проблема возникает в разрешении различий между новым кодом и существующими экземплярами закрытия, живыми в пространстве текущего процесса. Кроме того, лямбды имеют тенденцию использовать дженерики намного больше, чем другой код и поражать выпуск № 2.

, детали являются довольно волосатыми и немного также включены для нормального ТАК ответ. Я рассмотрел запись длинного сообщения в блоге на предмете. Если я найду время для него, то я свяжу его назад в этот конкретный ответ.

17
ответ дан 1 December 2019 в 03:52
поделиться

Согласно списку Поддерживаемые Изменения Кода , Вы не можете добавить поля к существующим типам. Анонимные методы компилируются в странно названные классы (своего рода <>_c__DisplayClass1), которые являются точно что: типы. Даже при том, что Ваши модификации к анонимному методу не могут включать изменение набора вложенных переменных (добавляющий, что они изменили бы поля существующего класса), я предполагаю, что это - причина, невозможно изменить анонимные методы.

1
ответ дан 1 December 2019 в 03:52
поделиться

Перезапуск модульного теста должен занять несколько секунд, если это. Я никогда не любил "редактирование и продолжаю" модель, чтобы быть честным - необходимо всегда повторно выполнять с нуля IMO, на всякий случай изменение на полпути посредством выполнения влияло бы на код, который работал ранее. Учитывая, что, Вы - более обеспеченные модульные тесты использования, которые могут быть выполнены с очень быстрым благоприятным поворотом. Если Ваши отдельные модульные тесты занимают невыносимое время для запуска, это - что-то, что необходимо посмотреть на обращение.

РЕДАКТИРОВАНИЕ: Что касается того, почему это не работает - можно найти, что это работает на некоторые лямбды, но не других. Лямбда-выражения, которые не получают переменных (включая this) кэшируются в частной статической переменной, так, чтобы только один экземпляр делегата когда-либо создавался. Изменение кода означает повторно инициализировать ту переменную, которая могла иметь интересные побочные эффекты, которые я подозреваю.

0
ответ дан 1 December 2019 в 03:52
поделиться
Другие вопросы по тегам:

Похожие вопросы: