我有以下代码在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
的流畅扩展方法答案 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()