2017-08-29 124 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。这就是为什么我想首先宣布它。

另请注意,生产代码包含匿名对象而不是整数。

编辑

下面的代码它更接近生产,我似乎没有管理适应所提供的答案。它编译但是抛出一个执行错误。

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) 

误差最高审计机关以下

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声明类型。如果你改变了第二行

Dim lstOrdered As IOrderedEnumerable(Of Integer) 

套装Option Strict On在编译时捕捉这些错误它应该工作。您可以将语句Option Strict On作为代码文件中的第一个语句,将该选项设置为Test | Options | Environment | Projects and Solutions | VB Defaults中的默认选项。

+0

如果不是'Integer',我有匿名对象呢? –

+0

@AsierAzkuenaga你可以随时做我做过的事情。按照第一个示例编写代码,然后将鼠标悬停在第二条语句的'lstOrderered'上,并让IDE告诉您为该变量推断了哪种类型。这是'Dim'语句中使用的类型。 – Blackwood

+0

如何声明'OrderedEnumerable(Of VB $ AnonymousType_3(Of Object,Object),Object)'虽然? –

相关问题