Как метод может ссылаться на локальную переменную вне своей области видимости
Он не может и не может.
Может иногда ссылаются на объект, на который указывает локальная переменная.
Может ли это зависеть от того, каким образом выражение компилируется или используется иным образом.
Существует три способа выражения Expressions.скомпилирует выражение в метод:
- Компиляция с
Compile()
в IL в DynamicMethod
. - Компиляция в IL в
CompileToMethod()
(доступно не во всех версиях. - Компиляция с
Compile()
в интерпретированный набор инструкций с делегатом thunk, который выполняет интерпретацию.
Первый используется, если доступна компиляция IL, если только true
передается для предпочтения интерпретации (в тех версиях с такой перегрузкой), и интерпретация также недоступна. Здесь для закрытия используется массив, и он почти такой же, как закрытие по локальной переменной в делегате.
TВторой используется для записи в другую сборку и не может закрываться таким образом.По этой причине многие константы, которые будут работать с Compile()
, не будут работать с CompileToMethod()
.
Третья используется, если компиляция IL недоступна или true
была передана в тех версиях, которые имеют эту перегрузкупредпочесть интерпретацию.Здесь ссылка на объект помещается в массив «констант», на которые затем может ссылаться интерпретатор.
Другая возможность состоит в том, что что-то еще полностью интерпретирует выражение, например, при создании кода SQL.Обычно это не удастся с не примитивными константами, отличными от строки, хотя, но если обработчик запросов знает о типе константы (например, если он относится к типу сущности, о которой он знает), тогда создайте код, эквивалентный этому.сущность может быть произведена.