Ответ 1
Да, код может быть собран в мусор. Когда вы вызываете компиляцию на выражение T, код компилируется в DynamicMethod, и они имеют право на сбор мусора.
В действительности это не указано в MSDN, но вы можете взглянуть на реализацию Expression <T> .Compile в DLR, что является чем-то .NET 4.0:
http://dlr.codeplex.com/SourceControl/changeset/view/54115#990638
Хотя реализация компилятора была различной в .net 3.5, DynamicMethods все еще использовались (источник: я сам, я реализовал System.Linq.Expressions в Mono).
Случай, когда скомпилированные деревья выражений не собираются, заключается в использовании Expression <T> CompileToMethod и что вы передаете MethodBuilder из AssemblyBuilder, который не был создан с флагом RunAndCollect.