Ответ 1
Обновление. Это больше не проблема с С# 6, в которой введен оператор
nameof
для решения таких сценариев (см. MSDN).
Похоже, что ответ на мой вопрос: нет; эта функция нестандартизирована. Ситуация кажется еще более мрачной, чем первоначально предполагалось изначально; не только продвижение захваченных переменных нестандартизировано, но и вся спецификация преобразования анонимных функций в их представления дерева выражений.
Следствием этого является то, что даже простые анонимные функции, такие как ниже, не гарантируют получение согласованных деревьев выражений в разных реализациях структуры (до тех пор, пока стандартизация преобразования не будет):
Expression<Func<int, int, int>> add = (int x, int y) => x + y;
Следующие фрагменты взяты из С# Language Specification 4.0 (выделение добавлено во всех случаях).
Из "4.6 Деревья выражений":
Точное определение типового типа
Expression<D>
, а также точные правила построения дерева выражений, когда анонимная функция преобразуется в тип дерева выражений, выходят за рамки этой спецификации > и описаны в другом месте.
Из "6.5.2 Оценка анонимных преобразований функций в типы дерева выражений":
Преобразование анонимной функции в тип дерева выражений создает дерево выражений (§4.6). Точнее, оценка преобразования анонимной функции приводит к построению структуры объекта, которая представляет собой структуру самой анонимной функции. Точная структура дерева выражений, а также точный процесс его создания определяются реализацией.
Третий пример в "6.5.3 примере реализации" демонстрирует преобразование анонимной функции, которая фиксирует локальную переменную, и подтверждает указанную в моем вопросе рекламу переменной:
Время жизни локальной переменной теперь должно быть увеличено до, по крайней мере, времени жизни анонимного делегата функции. Это может быть достигнуто путем "подъема" локальной переменной в поле сгенерированного компилятором класса. Создание локальной переменной (§7.15.5.2) затем соответствует созданию экземпляра сгенерированного класса компилятора, а доступ к локальной переменной соответствует доступу к полю в экземпляре сгенерированного компилятором класса.
Это дополнительно подтверждается в конце раздела:
Тот же метод, применяемый здесь для захвата локальных переменных, также может быть использован при преобразовании анонимных функций в деревья выражений: ссылки на сгенерированные объекты компилятора могут быть сохранены в дереве выражений, и может быть представлен доступ к локальным переменным как доступ к полям на этих объектах. Преимущество этого подхода заключается в том, что он позволяет "поднятым" локальным переменным делиться между делегатами и деревьями выражений.
Однако в начале раздела есть отказ от ответственности:
Реализация, описанная здесь, основана на тех же принципах, которые используются компилятором Microsoft С#, но это никоим образом не утвержденная реализация, и она не единственная возможная. Он лишь кратко упоминает преобразования в деревья выражений, так как их точная семантика выходит за рамки этой спецификации.
P.S. Eric Lippert подтверждает в этом комментарии, что спецификации дерева выражений никогда не отправлялись. Существует Expression Trees v2 Spec в документации DLR на CodePlex, но его область видимости не охватывает преобразование анонимных функций в деревья выражений в С#.