2017-08-29 18 views
3

私は、.NET 4.5を使用していると私は、次の点を理解したいと思います:なぜ、ThenByは次の場合に例外を発生させますか?

Dim lst = Enumerable.Range(1, 10) 
    Dim lstOrdered = lst.OrderBy(Function(i) i Mod 2) 
    Dim lst2 = lstOrdered.ThenBy(Function(i) -i) 

ただし、以下はSystem.MissingMemberException

Dim lst = Enumerable.Range(1, 10) 
    Dim lstOrdered 
    lstOrdered = lst.OrderBy(Function(i) i Mod 2) 
    Dim lst2 = lstOrdered.ThenBy(Function(i) -i) 
提起:

私はこのすべてが期待どおりに動作を実行した場合

実際のコードでは、OrderByとOrderByDescendingを動的に適用し、ThenByとThenByDescendingを使用して動的に続行する必要があります。それが私が最初に宣言したい理由です。

また、プロダクションコードには整数ではなく匿名のオブジェクトが含まれています。

EDIT

次のコード、それは生産に近いだと私は答え提供への適応を管理していないようです。それはコンパイルされますが、実行エラーがスローされます。

Dim lst = Enumerable.Range(1, 10).Select(Function(i) New With {.a = "foo", .b = i Mod 2, .c = -i}) 
Dim lstOrdered As IOrderedEnumerable(Of Object) 
lstOrdered = lst.OrderBy(Function(i) i.b) 
Dim lst2 = lstOrdered.ThenBy(Function(i) i.c) 

エラーがあなたの2番目の例では、次の

Unable to cast object of type 'System.Linq.OrderedEnumerable`2[VB$AnonymousType_3`3[System.String,System.Int32,System.Int32],System.Int32]' to type 'System.Linq.IOrderedEnumerable`1[System.Object]' 

答えて

3

をサイス、あなたはlstOrderedのための型を宣言しませんでした。あなたはコンパイル時にこれらのエラーをキャッチするために設定Option Strict On

Dim lstOrdered As IOrderedEnumerable(Of Integer) 

に二行目を変更した場合には動作するはずです。コードファイルの最初の文をOption Strict Onにして、テスト|オプション|環境|プロジェクトとソリューション| VBのデフォルトでそのオプションをデフォルトに設定することができます。

+0

「整数」の代わりに匿名オブジェクトがあるとしたらどうなりますか? –

+0

@AsierAzkuenagaあなたはいつも私がやったことをすることができます。あなたの最初の例のようにコードを書いてから、2番目のステートメントの 'lstOrderered'にカーソルを置いて、IDEがその変数についてどのような型を推測したかを教えてください。これは 'Dim'ステートメントで使用する型です。 – Blackwood

+0

'OrderedEnumerable(Of VB $ AnonymousType_3(Of Object、Object)、Object)'を宣言する方法はありますか? –

関連する問題