0

我有以下代码在 VB.net ( VS 2012 ) 中运行良好。请注意, m.Listen 返回一个 IObservable(of 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)

这是自定义用户控件的一部分,我有一些将 IObservables 绑定到模型的扩展方法。然而细节无关紧要。当我将代码更改为

    (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 的流畅扩展方法

4

1 回答 1

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语句修复它:

Call "123".Dump()

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

Call New Object().ToString()
于 2012-12-05T08:16:01.210 回答