2011-02-18 19 views

回答

7

這在VB.NET 10語言規範的第11.1節指出:

拉姆達之間的精確翻譯 方法和表達式樹可以不 固定在 編譯器的版本之間並超出本規範的範圍爲 。對於Microsoft 的Visual Basic 10.0,所有的λ 表達式可以被轉換成 表達式樹受 以下限制:

  1. 只有單行lambda表達式,而不ByRef參數的 可以轉換爲表達式樹。 在單行Sub lambda中,只有 調用語句可能會被轉換爲表達式樹 。
  2. 如果使用較早的字段初始值設定項來初始化後續的字段 ,例如 ,則匿名類型表達式不能轉換爲表達式樹。用{.a = 1, .b =。a}
  3. 如果在 字段初始值設定項之一中使用了當前被初始化的 對象的成員,則對象初始值設定項表達式不能轉換爲表達式 樹。 使用{.a = 1,.b = .Method1()}
  4. 的新C1如果多維數組創建表達式只有在顯式聲明它們的 元素類型時才能轉換爲 表達式樹。
  5. 後期綁定表達式不能轉換爲表達式樹。
  6. 當一個變量或字段的ByRef傳遞給調用 的表達,但不具有完全相同 相同類型的的ByRef參數, 或當一個屬性被傳遞的ByRef, 正常VB語義是的 的副本參數傳遞ByRef並將其最終值 複製回 的變量或字段或屬性。在 表達式樹中,回寫不會發生 。

所有這些限制也適用於嵌套的 lambda表達式。

這是您遇到的第一個項目的限制。引言留下了很大的空間,可以認爲這將在未來的版本中有效,當然還有很多可以獲得。 Connect.microsoft.com是一個鼓勵他們的好地方。我無法檢查是否已經爲此打開了反饋項目,該站點現在位於弗裏茨。

11

VB.Net支持兩種lambda表達式:

  • 表達的lambda包含一個表達式,隱式返回的表達。
    例如:Function(x) x.ToString()

  • lambda表達式包含一個或多個語句,必須明確地使用Return關鍵字(如果返回值)
    這些新至2010年VB.Net
    例如:

    Sub(x) 
        Logger.Log(x) 
        Console.WriteLine(x) 
    End Sub 
    

Where方法,和所有其他IQueryable方法,TA ke expression trees
編譯器可以自動編譯表達式 lambdas,但不包括語句lambda表達式到表達式樹中。

你的第二個例子試圖通過語句 lambda作爲Expression(Of Func(Of T, Boolean)),但編譯器不能這樣做。

+0

+1; [此鏈接](http://msdn.microsoft.com/en-us/library/bb397687.aspx)也非常豐富(儘管它使用C#語法) – 2011-02-18 01:06:50