表达式树深度限制

5
我在尝试调用类型为Expression<Func<MyType, bool>>的LambdaExpression上的Compile()方法时遇到了问题,其深度约为400。较小的值不会引起任何问题。我找不到关于此类限制的任何信息。有人能澄清一下吗?我能增加这个限制吗?
更新: 抱歉,忘记提到,我遇到了StackOverflowException异常: 在System.Core.dll中未处理的类型为“System.StackOverflowException”的异常发生 {无法评估表达式,因为当前线程处于堆栈溢出状态。}

什么是“问题”?会发生什么?是StackOverflowException吗?还是其他的? - Marc Gravell
1
对我来说,这有点属于雷蒙德·陈的范畴[如果你不得不问,那么你可能正在做一些错误的事情]。 - AakashM
@AakashM 谢谢你又提供了一个有用的书签 :) 我完全同意 - Chris Shain
是的,我也完全同意 :) 我相信在我的情况下有优化表达式树的方法,可以减少深度,我正在尝试做到这一点。尽管如此,了解这种行为背后的真正原因仍然很有趣。所以,Chris,谢谢你;) - Zim
1个回答

3
您遇到了栈大小的限制(虽然我对使用400多个元素的lambda表达式的智慧有所质疑)。最简单的方法是创建一个新线程专门用于使用较大的堆栈执行此编译,使用需要堆栈大小作为参数的线程构造函数:http://msdn.microsoft.com/en-us/library/ms149581.aspx
在该线程中调用compile并根据需要增加堆栈大小参数。我认为它是以字节为单位的,默认值约为1048576,因此从那里开始并根据需要增加。

此解决方案现在仅限于完全信任。从.NET Framework 4开始,只有完全受信任的代码才能将maxStackSize设置为大于默认堆栈大小(1兆字节)的值。如果在以部分信任运行代码时指定了更大的maxStackSize值,则maxStackSize将被忽略并使用默认堆栈大小。不会抛出任何异常。任何信任级别的代码都可以将maxStackSize设置为小于默认堆栈大小的值。 - bentayloruk

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接