2009-12-08 62 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