属性和接口

时间:2011-02-07 16:40:30

标签: .net vb.net

我想将一个属性声明为接口的接口集合,我想稍后在构造函数中实现显式类型。这样的事情。

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.List 1[NtnAgent.LicenseFileDataNode]' can't be converted to an object of the type 'System.Collections.Generic.IList 1 [NtnAgent.ILicenseFileDataNode]'。

简而言之,问题是“为什么它不起作用”?这是一个简化的场景,但是很容易进行一次工作,但我需要理解它的原因,因为它失败了。

谢谢!

2 个答案:

答案 0 :(得分: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插入List<Animal>,这显然是荒谬的,因为EvilAnimal不是Animal

答案 1 :(得分:1)

> "Why It Didn't work"?

因为IList(Of ILicenseFileDataNode)的元素类型 与List(Of LicenseFileDataNode)

的元素类型不同

示例:如果LicenseFileDataNodeLicenseFileDataNodeMock都实现ILicenseFileDataNode

然后两者都可以添加到IList(Of ILicenseFileDataNode),但List(Of LicenseFileDataNode)不能 包含LicenseFileDataNodeMock个项目。

使用List(Of ILicenseFileDataNode)应该按预期工作。

有关详细信息,请参阅Covariance and Contravariance in Generics