簡體   English   中英

具有語句主體的lambda表達式無法轉換為表達式樹

[英]A lambda expression with a statement body cannot be converted to an expression tree

StackOverlow上有幾個關於語句體表達式的問題。 我只是想知道為什么不能在C#中做到這一點? (為什么它沒有在編譯器中實現的復雜性在哪里?)

@ eric-lippert 對memberof / infoof很好的解釋 語句體表達式轉換是否有類似的解釋?

更新 (基於Jon Skeet的回答):

我的用例是可以在運行時輕松轉換C#代碼轉換。 我想知道大量努力在哪里? 編譯器應該已經在編譯期間構建了一些類似的表達式樹 - 或者是否存在隱藏的復雜性,如infoof的情況?

表達式樹最初是為LINQ創建的,它與查詢有關。 查詢通常是基於函數的,因此單表達式lambdas非常適合,無需擔心表達式樹中的控制流等。我懷疑將任意語句lambdas的表達式樹轉換為SQL等將是一個愚蠢的差事。

表達樹后來針對.NET 4進行了增強(主要是為了DLR,我相信)但是C#4編譯器實際上並不需要為lambda表達式創建復雜的表達式樹 - 所以它主要是因為它沒有'它足夠的好處值得它。

換句話說:你的用例是什么,可以證明包括它可能需要大量的努力? 也許這樣的使用情況下,也許在C#的未來版本的團隊將決定這是值得的。 但目前,能夠將表達式lambda轉換為表達式樹有一個明顯的好處 - 但為語句lambdas做同樣的額外努力沒有相應的好處。

編輯:有,絕對沒有理由的C#編譯器將需要具有的代碼中的表達式樹表示(在以下方面System.Linq.Expressions ),但有一個抽象語法樹。

我懷疑你真正想要的是Roslyn - 它仍然在CTP中,但它基本上是一個編譯器API。 Roslyn AST不是設計用於與表達式樹相同的場景,但如果您對編譯器轉換感興趣,它可能仍然是您想要的。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM