2011-02-18 20 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