将Linq IEnumerable强制转换为继承IEnumerable的类

将Linq IEnumerable强制转换为继承IEnumerable的类,linq,ienumerable,casting,Linq,Ienumerable,Casting,我有一个resultset类: Public Class AResultSet Implements IEnumerable(Of ConcreteResult) Private _list As List(Of ConcreteResult) Public Sub New() _list = New List(Of ConcreteResult) End Sub Public Function GetEnumerator() As

我有一个resultset类:

Public Class AResultSet
    Implements IEnumerable(Of ConcreteResult)

    Private _list As List(Of ConcreteResult)

    Public Sub New()
        _list = New List(Of ConcreteResult)
    End Sub

    Public Function GetEnumerator() As System.Collections.Generic.IEnumerator(Of ConcreteResult) Implements System.Collections.Generic.IEnumerable(Of ConcreteResult).GetEnumerator
        Return _list.GetEnumerator
    End Function

    Public Function GetEnumerator1() As System.Collections.IEnumerator Implements System.Collections.IEnumerable.GetEnumerator
        Return _list.GetEnumerator
    End Function
End Class
和linq查询:

Dim res As AResultSet = (From pk In testPackages, _
         pp In pk.PackagePriceCollection _
          Select New ConcreteResult(pk, pp))
但我犯了一个演员错误。所以如果我改变主意

Dim res As AResultSet 
致:

它起作用了。但是我想将linq查询结果强制转换为AResultSet类型,它也是一个IEnumerable(ConrecteResult的)


还是我在这里做错了什么?

调用
Select
的结果不是
AResultSet
,这就是强制转换失败的原因。查询中没有任何内容知道您要创建
AResultSet
。仅仅因为result和
AResultSet
都实现了相同的接口并不意味着它们是相同的类型

您可以根据结果创建
AResultSet
的实例,但是:

Dim query = (From pk In testPackages, _
     pp In pk.PackagePriceCollection _
     Select New ConcreteResult(pk, pp))
Dim res as AResultSet = new AResultSet(query.ToList)

调用
Select
的结果不是
AResultSet
,这就是强制转换失败的原因。查询中没有任何内容知道您要创建
AResultSet
。仅仅因为result和
AResultSet
都实现了相同的接口并不意味着它们是相同的类型

您可以根据结果创建
AResultSet
的实例,但是:

Dim query = (From pk In testPackages, _
     pp In pk.PackagePriceCollection _
     Select New ConcreteResult(pk, pp))
Dim res as AResultSet = new AResultSet(query.ToList)

虽然我不清楚为什么您可能想要创建一个类来复制
List(of T)
的功能,但您所尝试的并不是直接可行的。您应该在类中创建一个隐式(
加宽
)用户定义的强制转换运算符,或者创建一个构造函数,该构造函数接受一个
IEnumerable(Of ConcreteResult)
,并使用它填充私有列表字段

Public Class AResultSet
      Implements IEnumerable(Of ConcreteResult)
   Private list As List(Of ConcreteResult)
   Private Sub New(l As List(Of ConcreteResult))
      list = l
   End Sub
   Public Shared Widening Operator CType(seq As IEnumerable(Of ConcreteResult)) As AResultSet
      Return New AResultset(seq.ToList())
   End Sub
   ...
End Class 

虽然我不清楚为什么您可能想要创建一个类来复制
List(of T)
的功能,但您所尝试的并不是直接可行的。您应该在类中创建一个隐式(
加宽
)用户定义的强制转换运算符,或者创建一个构造函数,该构造函数接受一个
IEnumerable(Of ConcreteResult)
,并使用它填充私有列表字段

Public Class AResultSet
      Implements IEnumerable(Of ConcreteResult)
   Private list As List(Of ConcreteResult)
   Private Sub New(l As List(Of ConcreteResult))
      list = l
   End Sub
   Public Shared Widening Operator CType(seq As IEnumerable(Of ConcreteResult)) As AResultSet
      Return New AResultset(seq.ToList())
   End Sub
   ...
End Class