2009-12-08 66 views
0

我有一个结果类:铸造的LINQ IEnumerable的类继承了IEnumerable

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 

要:

Dim res As IEnumerable(Of ConcreteResult) 

它的工作原理。但我想将linq查询结果转换为AResultSet类型,该类型也是IEnumerable(OfConrecteResult)。

或者我在这里做错了什么?

回答

3

调用Select的结果不是AResultSet,这就是铸造失败的原因。查询中没有任何内容知道您要创建AResultSet。仅仅因为结果和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) 
0

虽然这是我不清楚为什么你可能要创建一个类来复制的List(Of T)的功能,你正在尝试做不是直接可能的。您应该在您的课程中创建一个隐式(Widening)用户定义的演员操作符,或者创建一个构造函数,它需要一个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