将Linq IEnumerable强制转换为继承IEnumerable的类
我有一个resultset类:将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
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