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