2012-03-08 120 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