2012-03-08 117 views
0

对于这个问题我有这些类:VB泛型“不能转换”

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 

在主类我想调用下面的函数:

Private Sub FetchSubscriptions(ByVal websites As WebsiteCollection) 
     gUser.SubscriptionList.LoadSubscriptions(websites) 
     // code 
End Sub 

这将访问LoadSubscriptions与传递“网站”变量。

正如你所看到的LoadSubscriptions需要一个BaseCollection(IBaseLeaf)。

“网站”变量是一个WebsiteCollection,它是BaseCollection(Of WebsiteLeaf(标题))。

现在我收到错误:类型'WebsiteCollection'的值无法转换为'BaseCollection(Of IBaseLeaf)'。

我在做什么错在这里?

+0

您可能想了解[泛型中的协变和逆变](http://msdn.microsoft.com/zh-cn/library/dd799517.aspx) – MarkJ 2012-03-08 20:21:33

回答

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 

如果你打电话LoadSubscriptionsWebsiteCollection会发生什么?

Public Sub LoadSubscriptions(ByVal collection As BaseCollection(Of IBaseLeaf))  
    collection.Add(New TestClass()) 
End Sub