2011-02-07 97 views
0

我想聲明一個屬性作爲一個接口的接口集合,我想稍後在構造函數中實例化顯式類型。像這樣的東西。屬性和接口

Public Class LicenseFile 
    Implements ILicenseFile 

    Public Property Collection As IList(Of ILicenseFileDataNode) 

    Public Sub New() 
     Collection = New List(Of LicenseFileDataNode) 'here throws an exception. 
    End Sub 

End Class 

當然,LicenseFileDataNode器具ILicenseFileDataNode

構造獨特的線發動例外又說什麼:

「類型 「System.Collections.Generic的目的。列表1[NtnAgent.LicenseFileDataNode]' can't be converted to an object of the type 'System.Collections.Generic.IList 1 [NtnAgent.IRCANFileDataNode]'。

總之,t他的問題是「爲什麼它不工作」?這是一個簡化的方案,但很容易採取一個工作週期,但我需要了解原因,因爲它失敗了。

謝謝!

回答

1

讓我們更簡單地推理一下。假設IAnimal是您的界面,並且Animal是實現IAnimal的具體類型。那麼,List<Animal>不是IList<IAnimal>。爲什麼?因爲List<Animal>可以接受Animal的實例,並且IList<IAnimal>可以接受實現IAnimal的對象。試想一下:

class Animal : IAnimal { } 
class EvilAnimal : IAnimal { } 

因此,如果我們可以的List<Animal>一個實例分配給IList<IAnimal>類型的變量,可以插入EvilAnimal s轉換你的List<Animal>,這顯然是荒謬的,因爲EvilAnimal不是Animal

+0

+1。爲了進一步研究,Google協方差和逆變。 – StriplingWarrior 2011-02-07 16:46:00

1
> "Why It Didn't work"? 

由於IList(Of ILicenseFileDataNode) 元素類型是從List(Of LicenseFileDataNode)

例的元素類型diffenrent:如果LicenseFileDataNodeLicenseFileDataNodeMock都實現ILicenseFileDataNode

然後既可以添加到IList(Of ILicenseFileDataNode)List(Of LicenseFileDataNode)不能 包含LicenseFileDataNodeMock項目。

使用List(Of ILicenseFileDataNode)應該按預期工作。

更多詳情請參閱Covariance and Contravariance in Generics