5

Tôi đang gặp sự cố khi cố gọi Compile() trên LambdaExpression loại Expression < Func < MyType, bool >> có độ sâu khoảng 400. Và giá trị thấp hơn không gây ra bất kỳ sự cố nào. Và tôi không thể tìm thấy bất cứ điều gì về giới hạn như vậy. Bất cứ ai có thể làm rõ điều này? Tôi có thể tăng giới hạn này không?Giới hạn chiều sâu cây biểu thức

UPD: Xin lỗi, quên đề cập đến, tôi nhận được StackOverflowException:

Một ngoại lệ unhandled của loại 'System.StackOverflowException' xảy ra trong System.Core.dll {Không thể đánh giá biểu hiện bởi vì các chủ đề hiện tại đang ở trạng thái tràn ngăn xếp.}

+2

bạn nhận được ngoại lệ nào? –

+0

"sự cố" là gì? chuyện gì xảy ra một 'StackOverflowException'? hoặc là ...? –

+1

Đối với tôi điều này hơi rơi vào thể loại Raymond Chen [Nếu bạn phải hỏi, có thể bạn đang làm điều gì đó sai] (http://blogs.msdn.com/b/oldnewthing/archive/2007/03/01/1775759 .aspx) – AakashM

Trả lời

3

Bạn đang hợp pháp chạy vào giới hạn về kích thước ngăn xếp (mặc dù tôi đặt câu hỏi về sự khôn ngoan của 400 mục lambda). Cách dễ nhất để bỏ qua đó là tạo một chuỗi mới cụ thể để thực hiện việc biên dịch này với một ngăn xếp lớn hơn, sử dụng trình tạo chủ đề có kích thước ngăn xếp làm đối số: http://msdn.microsoft.com/en-us/library/ms149581.aspx

Gọi biên dịch trong chuỗi đó và tăng kích thước ngăn xếp đối số khi cần thiết. Nó là theo byte tôi tin rằng, mà sẽ làm cho mặc định về 1048576, do đó, bắt đầu ở đó và nâng cao nó khi cần thiết.

+0

Giải pháp này hiện được giới hạn ở mức độ tin cậy đầy đủ. "Bắt đầu với .NET Framework 4, chỉ toàn bộ mã đáng tin cậy mới có thể đặt maxStackSize thành một giá trị lớn hơn kích thước ngăn xếp mặc định (1 megabyte). Nếu giá trị lớn hơn được chỉ định cho maxStackSize khi mã đang chạy với phần tin cậy, maxStackSize là bỏ qua và kích thước ngăn xếp mặc định được sử dụng. Không có ngoại lệ nào được ném. Mã ở bất kỳ cấp độ tin cậy nào cũng có thể đặt maxStackSize thành giá trị nhỏ hơn kích thước ngăn xếp mặc định. " – bentayloruk