解决方法
是的,代码可以被垃圾回收.当您对T的表达式调用编译时,代码将编译为
DynamicMethod,那些可以进行垃圾回收.
实际上,它没有在MSDN上显示,但是您可以看看DLS中的Expression< T> .Compile的实现,它是.net 4.0发布的:
http://dlr.codeplex.com/SourceControl/changeset/view/54115#990638
虽然编译器的实现在.net 3.5中不同,但DynamicMethods仍然使用(源:我自己,我在Mono中实现了System.Linq.Expressions).
编译表达式树不可收集的情况是当您使用Expression<T>CompileToMethod时,并且您从AssemblyBuilder传递了一个MethodBuilder,该程序库未使用RunAndCollect标志创建.