对于这个问题,我有这些课程:
Public MustInherit Class BaseLeaf(Of T)
Implements IBaseLeaf
// etc
Public Class WebsiteLeaf
Inherits BaseLeaf(Of Headline)
// etc
Public Class WebsiteCollection
Inherits BaseCollection(Of WebsiteLeaf)
// etc
Public Class SubscriptionList
Private mCollection As BaseCollection(Of IBaseLeaf)
Public Sub LoadSubscriptions(ByVal collection As BaseCollection(Of IBaseLeaf))
mCollection = collection
End Sub
在Main类中,我试图调用以下函数:
Private Sub FetchSubscriptions(ByVal websites As WebsiteCollection)
gUser.SubscriptionList.LoadSubscriptions(websites)
// code
End Sub
这将通过传递“sites”变量来访问LoadSubscriptions。
正如您所见,LoadSubscriptions需要一个BaseCollection(来自IBaseLeaf)。
“网站”变量是一个WebsiteCollection,它是一个BaseCollection(Of WebsiteLeaf(Of Headline))。
现在我收到错误:'WebsiteCollection'类型的值无法转换为'BaseCollection(Of IBaseLeaf)'。
我在这里做错了什么?
答案 0 :(得分:2)
如果班级B
是班级A
的后代,这并不意味着Collection(Of B)
是Collection(Of A)
的后代!
如果您有这些定义
Dim stringList As List(Of String)
Public Sub DoSomthingWithList(list As List(Of object))
list.Add(Date.Now)
End Sub
你可以像这样调用这个方法
DoSomthingWithList(stringList)
然后该方法会尝试将Date
添加到列表中,这实际上是一个字符串列表!由于参数的类型为object
,因此日期将被装箱(即转换为对象),但不会转换为字符串。
因此,集合List(Of X)
和List(Of Y)
永远不会兼容,即使Y
继承X
。
让我们看另一个例子
Public Class TestClass
Implements IBaseLeaf
// etc
如果您使用LoadSubscriptions
致电WebsiteCollection
会怎样?
Public Sub LoadSubscriptions(ByVal collection As BaseCollection(Of IBaseLeaf))
collection.Add(New TestClass())
End Sub