VB.NET:“您必须遵守《全国人大常委会关于维护互联网安全的决定》及中华人民共和国其他有关法律法规。”;语句lambda无法转换为表达式树;编译时错误

VB.NET:“您必须遵守《全国人大常委会关于维护互联网安全的决定》及中华人民共和国其他有关法律法规。”;语句lambda无法转换为表达式树;编译时错误,.net,vb.net,lambda,.net,Vb.net,Lambda,为何我可以这样做: Dim qNodes As IQueryable(Of XmlNode) = xDoc.ChildNodes.AsQueryable() Dim test = qNodes.Where(Function(node) True) 尽管以下给出了我在标题中所述的错误: Dim qNodes As IQueryable(Of XmlNode) = xDoc.ChildNodes.AsQueryable() Dim test = qNodes.Where(Function(node

为何我可以这样做:

Dim qNodes As IQueryable(Of XmlNode) = xDoc.ChildNodes.AsQueryable()
Dim test = qNodes.Where(Function(node) True)
尽管以下给出了我在标题中所述的错误:

Dim qNodes As IQueryable(Of XmlNode) = xDoc.ChildNodes.AsQueryable()
Dim test = qNodes.Where(Function(node)
                               Return True
                           End Function)
?


我真的不明白。VB.Net支持两种lambda表达式:

  • 表达式lambda包含单个表达式并隐式返回该表达式。
    例如:
    Function(x)x.ToString()

  • 语句lambda包含一个或多个语句,必须显式使用
    Return
    关键字(如果它们返回值)
    这些是VB.Net 2010的新增功能。
    例如:

    Sub(x)
        Logger.Log(x)
        Console.WriteLine(x)
    End Sub
    
Where
方法以及所有其他
IQueryable
方法都采用。
编译器可以自动将表达式lambdas(而不是语句lambdas)编译到表达式树中


第二个示例尝试将语句lambda作为
表达式(Of Func(Of T,Boolean))
传递,但编译器无法这样做。

这在VB.NET 10语言规范的第11.1节中有说明:

lambda和lambda之间的精确转换 方法和表达式树可能不可用 在不同版本的 编译器的范围之外 本规范。对于微软 Visual Basic 10.0,所有lambda 表达式可以转换为 表达式树受 以下限制:

  • 只有不带ByRef参数的单行lambda表达式 可以转换为表达式树。 仅适用于单线子lambda 调用语句可以被转换 表示树
  • 如果出现以下情况,则无法将匿名类型表达式转换为表达式树: 早期的字段初始值设定项用于 初始化后续字段 初始值设定项,例如{.a=1的New, .b=.a}
  • 无法将对象初始值设定项表达式转换为表达式 树(如果是当前 正在初始化的对象在中使用 其中一个字段初始值设定项,例如。 带有{.a=1,.b=.Method1()}的新C1
  • 多维数组创建表达式只能转换为 表达式树,如果它们声明 元素类型
  • 后期绑定表达式无法转换为表达式树
  • 当变量或字段被ByRef传递给调用时 表达式,但不具有精确的 与ByRef参数的类型相同, 或者当一个属性被ByRef传递时, 正常的VB语义是 参数通过ByRef及其 然后将最终值复制回 变量、字段或属性。在里面 表达式树,复制回 不会发生
  • 所有这些限制都适用于嵌套 lambda表达式也是如此

    这是您遇到的第一项中的限制。本文的介绍给我们留下了足够的空间来假设这将在未来的版本中得到解决,当然,我们还有很多收获。Connect.microsoft.com是鼓励他们的好去处。我无法检查是否已经为此打开了一个反馈项,该网站现在处于混乱状态。

    +1;信息量也很大(尽管它使用C#-语法)