我想将一个属性声明为接口的接口集合,我想稍后在构造函数中实现显式类型。这样的事情。
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]'。
简而言之,问题是“为什么它不起作用”?这是一个简化的场景,但是很容易进行一次工作,但我需要理解它的原因,因为它失败了。
谢谢!
答案 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)
示例:如果LicenseFileDataNode
和LicenseFileDataNodeMock
都实现ILicenseFileDataNode
然后两者都可以添加到IList(Of ILicenseFileDataNode)
,但List(Of LicenseFileDataNode)
不能
包含LicenseFileDataNodeMock
个项目。
使用List(Of ILicenseFileDataNode)
应该按预期工作。