Да, есть очень веская причина, почему вы не можете этого сделать. Простая причина - стоимость. Стоимость включения этой функции в C # (или VB) очень высока *.
Редактирование лямбда-функции - это особый случай класса проблем ENC, которые очень трудно решить с помощью текущей архитектуры ENC (Edit'n'Continue). А именно, очень сложно выполнить ENC для любого метода, в котором ENC выполняет одно из следующих действий: -
- Генерирует метаданные в виде класса
- Редактирует или генерирует универсальный метод
Первая проблема - это скорее логическое ограничение, но она также сталкивается с парой ограничений в архитектуре ENC. А именно проблема генерации первого класса не очень сложна. Что мешает, так это генерация класса после второго редактирования. Механизм ENC должен начать отслеживать таблицу символов не только для действующего кода, но и для сгенерированных классов. Обычно это не так уж плохо, но становится все труднее, когда форма сгенерированного класса основана на контексте, в котором он используется (как в случае с лямбдами из-за замыканий). Что более важно, как вы разрешаете различия с экземплярами классов, которые уже существуют в процессе?
Вторая проблема - это строгое ограничение в архитектуре CLR ENC. C # (или VB) ничего не может сделать, чтобы обойти это.
Лямбда, к сожалению, ударила обоими этими проблемами. Короткая версия заключается в том, что ENC'-лямбда включает в себя множество мутаций в существующих классах (которые могли или не могли быть сгенерированы из других ENC). Большая проблема заключается в устранении различий между новым кодом и существующими экземплярами замыканий, живыми в текущем пространстве процессов. Кроме того, лямбды, как правило, используют дженерики гораздо чаще, чем другой код, и ставят проблему №2.
Детали довольно волосатые и слишком сложны для нормального SO ответа. Я подумал написать длинную запись в блоге на эту тему. Если я доберусь до этого, я свяжу его с этим конкретным ответом.