关于包围的VB.Net和Linq语法

时间:2012-12-05 06:31:46

标签: vb.net linq

我有以下代码在VB.net(VS 2012)中正常工作。请注意,m.Listen返回一个IObservable(Maybe(of NominalObject))

    Dim d As IDisposable = (From x In m.Listen(Of Maybe(Of NominalObject))()
            From y In x
            Select New LAPViewCommands(y)).
            BindToControl(Me, Function(x) x.ViewModel)

    d.DisposeWith(Me)

这是自定义用户控件的一部分,我有一些扩展方法 将IObservable绑定到模型。但细节无关紧要。什么时候 我将代码更改为

    (From x In m.Listen(Of Maybe(Of NominalObject))()
            From y In x
            Select New LAPViewCommands(y)).
            BindToControl(Me, Function(x) x.ViewModel).
            DisposeWith(Me)

我有编译错误。请注意,流利的语法没有问题。

    m.
        Listen(Of Maybe(Of NominalObject)).
        SelectMany(Function(x) x.Select(Function(y) New LAPViewCommands(y))).
        BindToControl(Me, Function(x) x.ViewModel).
        DisposeWith(Me)

这个问题是VB.NET解析器的一个奇怪的边缘情况还是有什么东西 这里很重要我不见了?总之,问题是。为什么我不能括起来 LINQ查询表达式,然后使用返回void

的流畅扩展方法

1 个答案:

答案 0 :(得分:1)

问题是你的表达式不以标识符开头。

这是VB.Net的限制,不仅限于LINQ查询表达式。


比较以下C#代码(Dump是一种扩展方法)

"123".Dump();

(from a in "1223" select a).Dump();

new object().ToString();

哪个会好的。这是VB.Net等价物(或多或少看起来相同):

"123".Dump()

(From a in "123" Select a).Dump()

(New Object()).ToString()

并且三个语句中的每一个都会引发语法错误。

您可以使用Call statement

进行修复
Call "123".Dump()

Call (From a in "123" Select a).Dump()

Call New Object().ToString()