Ответ 1
await
включает перезапись компилятора значительный; сгенерированный ИЛ совсем не похож на исходный С# с переменным подъемом (на класс) и ветвлением, задачами, продолжениями и т.д. Конечно, это не то, что может быть представлено в простой лямбда, хотя в последних версиях .NET с более богатой поддержкой Expression
(Expression.Block
и т.д.), технически я предполагаю, что возможно, возможно, подражать большинству вещей, которые компилятор делает для await
, - но вы, вероятно, пойдете довольно осторожно, пытаясь сделать это вручную.
Нет, AFAIK, никакой возможности для автоматизации этого перевода не существует в API Expression
, и, честно говоря, я никогда не ожидал, что он будет.
То же самое можно сказать о ILGenerator
; откровенно говоря, AFAIK - единственный "простой" способ (и я использую слово "легко" совершенно неправильно) использовать await
в метапрограммировании - это сгенерировать С# и запустить его через roslyn или CSharpCodeProvider
.