2012-12-05 27 views
0

我有以下代碼在VB.net(VS 2012)中正常工作。需要注意的是m.Listen是返回一個的IObservable(的可能(的NominalObject))關於包圍的VB.Net和Linq語法

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的流利擴展方法

回答

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()