VB泛型“无法转换”

时间:2012-03-08 16:16:51

标签: vb.net generics

对于这个问题,我有这些课程:

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)'。

我在这里做错了什么?

1 个答案:

答案 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