为什么我可以转换为这种类型而不是另一种类型?

时间:2017-06-22 13:49:35

标签: vb.net generics

  

错误45'System.Collections.Generic.List(Of String)'不能   转换为'System.Collections.Generic.List(Of Object)'。考虑   使用'System.Collections.Generic.IEnumerable(Of Object)'   代替。 H:\ business \ shared \ Dropbox \ vb.net \ proxyhandler.vb 198 19 nicehash2

这是我得到的错误。替换

System.Collections.Generic.List(Of Object)

System.Collections.Generic.IEnumerable(Of Object)

解决了这个问题。

我知道第二种类型是接口。我仍然很困惑。

但为什么?

1 个答案:

答案 0 :(得分:2)

由于列表是可变的(您可以添加项目),因此无法将List(Of String)分配给List(Of Object)类型的变量(即使每个字符串都是对象)。

每个List(Of T)也是IEnumerable(Of T),但与列表相反,界面不支持修改(不将其强制转换为实际类型)。这就是语言允许使用界面而不是列表的原因。

考虑如果列表本身允许可能会发生什么(C# link):

Dim giraffes As New List(Of Giraffe)
giraffes.Add(new Giraffe())
Dim animals As List(Of Object) = giraffes ' doesn't compile but what happened otherwise:
animals.Add(new Lion()) ' Aargh!