我有一个结果集类:
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(Of ConrecteResult)。
或者我在这里做错了什么?
答案 0 :(得分: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)
答案 1 :(得分: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