0

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)

これはカスタムユーザーコントロールの一部であり、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()

そして、3つのステートメントのそれぞれが構文エラーをスローします。

Call次のステートメントを使用して修正できます。

Call "123".Dump()

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

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