2017-04-07 87 views

回答

1

是的,在第4.6節 「表達式樹類型的」 C#5規範文檔

4.6的表達式樹類型
表達式樹允許在lambda表達式被表示爲數據結構代碼可執行 代碼。表達式樹是 System.Linq.Expressions.Expression<D>形式的表達式樹類型的值,其中D是任何委託類型。 對於本規範的其餘部分,我們將使用簡寫Expression<D>來引用這些類型 。如果存在從 lambda表達式到代表類型D的轉換,則轉換也存在 表達式樹型Expression<D>。雖然將 lambda表達式轉換爲委託類型會生成一個代表, 將引用lambda表達式的可執行代碼,但轉換爲 表達式樹類型將創建表達式表達式的表達式樹表達式 。表達式樹是高效的內存數據表達式,並使得lambda表達式的結構透明和明確。就像代理類型 D一樣,Expression<D>被稱爲具有參數和返回類型,其中 與D的那些類型相同。以下示例表示 lambda表達式,它們都是可執行代碼和表達式樹。 由於存在到Func<int,int>,轉換也 存在於Expression<Func<int,int>>

Func<int,int> del = x => x + 1;      // Code 
Expression<Func<int,int>> exp = x => x + 1;  // Data 

按照這些任務,委託刪除引用 回報的方法x + 1,和表達式樹EXP引用一個數據 結構描述表達式x => x + 1。通用類型Expression的精確 定義以及精確的 規則當lambda表達式被轉換爲表達式樹類型時構建表達式樹都不在本規範的 的範圍之內。有兩件事是重要的,以明確:

  • 並非所有的lambda表達式都可以轉換爲表達式樹。例如,帶有語句正文的lambda表達式和包含賦值表達式的表達式不能表示。在 這些情況下,轉換依然存在,但在編譯時會失敗。 這些例外情況在§6.5中有詳細說明。
  • 表達提供了一個實例方法編譯產生類型d的代表:

    Func<int,int> del2 = exp.Compile();

調用此委託使由表達式 樹表示的代碼將被執行。因此,鑑於上文的定義,刪除和DEL2 是等效的,並且下面的兩個語句將具有相同的效果 :

int i1 = del(1); 
int i2 = del2(1); 

執行此代碼,I1後和i2都將具有值2

1

由於拉姆達被分配到一個Expression

+0

因此,如果它被命名爲Mexpression,它必須被分配給Mexpression而不是表達式?那麼,有沒有關於這方面的任何文件。 – lockedscope

+0

我添加了關於它的答案。 – lockedscope

2

從C#規範(6.1.12):

匿名函數和方法組沒有類型和自己的 ,但也可以是隱式轉換爲委託類型或 表達式樹類型。

所以匿名函數(拉姆達)本身並不具有類型,但是當你把它分配給Expression類型的變量(或傳遞給函數期待Expression參數) - 它是隱式轉換爲它(假設它是可能 - 不是每個匿名函數都可以轉換爲表達式樹)。與代表同樣的故事 - 如果你將它傳遞給期望Func<int,int>的函數或者分配給這種類型的變量 - 它將成爲委託而不是表達式樹。

相關問題