为什么ThenBy会在以下情况下引发异常?

时间:2017-08-29 14:37:42

标签: vb.net .net-4.5

我正在使用.NET 4.5,我想了解以下内容:

如果我执行此操作,一切都按预期工作:

  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]'  

1 个答案:

答案 0 :(得分:3)

在第二个示例中,您没有为Dim lstOrdered As IOrderedEnumerable(Of Integer) 声明类型。如果您将第二行更改为

,它应该可以工作
Option Strict On

设置Option Strict On以在编译时捕获这些错误。您可以将语句{ "_id": "ACCEPT0", "_rev": "1-92ea4e727271aefd0a2befed0d4bb736", "OfferID": "OFFER0" } { "_id": "ACCEPT1", "_rev": "3-986ca6e717b225ac909d644de54d5f7d", "OfferID": "OFFER3" } { "_id": "OFFER0", "_rev": "1-2af5f5c7b1c59dd3f0997f748a367cb2", "From": "merchant1", "To": "customer1" } { "_id": "OFFER1", "_rev": "6-f0927c5d4f9fd8a2d2b602f1c265d6d5", "From": "merchant1", "To": "customer2" } 作为代码文件中的第一个,将该选项设置为Test | Options | Environment | Projects and Solutions | VB Defaults中的默认选项。