我正在尝试使用一个只是字符串列表列表的变量。 我已经宣布如下:
Dim iRows As New List(Of List(Of String))
然后我试图将它作为参数传递给另一个方法,我已经将方法定义如下:
Public Sub Import(ByVal Rows As IList(Of IList(Of String)))
For Each Row As IList(Of String) In Rows
ImportRow(Row)
Next
End Sub
不幸的是,当我尝试运行该代码时,我遇到以下错误,它尝试将我的变量传递给我的方法。
System.InvalidCastException未被用户代码处理
Message =“无法转换类型为'System.Collections.Generic.List 1[System.Collections.Generic.List
的对象1 [System.String]]'以键入'System.Collections.Generic.IList 1[System.Collections.Generic.IList
1 [System.String ]]”。“
当我更改方法定义以使用类型而不是接口时,它可以工作。
Public Sub Import(ByVal Rows As List(Of List(Of String)))
For Each Row As IList(Of String) In Rows
ImportRow(Row)
Next
End Sub
那么,是否不可能以这种方式将泛型与接口一起使用?只要我没有嵌套它就可以正常工作。
答案 0 :(得分:5)
是的, 可以创建IList(Of IList(Of String))
- 但List(Of (List(Of String))
不是。考虑到在后一种情况下你可以调用
listOfLists.Add(arrayOfStrings)
作为字符串数组实现IList(Of String)
。
基本上这与考虑IList(Of Fruit)
和List(Of Banana)
完全相同 - 一堆香蕉不是水果碗,因为你不能添加苹果。
在您的情况下,您需要创建List(Of IList(Of String))
- 或声明IList(Of List(Of String))
。
现在有趣的是,由于通用协方差和逆变,可以在.NET 4中使用List(Of List(Of String))
作为IEnumerable(Of IEnumerable(Of String))
- {{1在IEnumerable(Of T)
中是协变的。但是,T
不变。
通用协方差和逆变是一个棘手的话题。 Eric Lippert有written a great deal about it - 使用C#作为语言而不是VB,但希望你仍然可以理解它。
答案 1 :(得分:2)
首先声明iRows:
Dim iRows As New List(Of IList(Of String))
然后,当您向new List(Of String)
添加iRows
时,它会隐式投射。
答案 2 :(得分:-3)
请尝试以下更改:
Public Sub Import(ByVal Rows As List(Of List(Of String)))
For Each Row As List(Of String) In Rows
ImportRow(Row)
Next
End Sub
似乎无需从List
投射到IList
。