Tor*_*ton 1 vb.net string generics interface list
我正在尝试使用一个变量,它只是一个字符串列表的列表.我已经宣布如下:
Dim iRows As New List(Of List(Of String))
Run Code Online (Sandbox Code Playgroud)
然后我试图将它作为参数传递给另一个方法,我已经定义了如下方法:
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
Run Code Online (Sandbox Code Playgroud)
不幸的是,当我尝试运行该代码时,我得到以下错误,它尝试将我的变量传递给我的方法.
用户代码未处理System.InvalidCastException消息="无法将类型为'System.Collections.Generic.List 1[System.Collections.Generic.List1 [System.String]]'的对象强制转换为'System.Collections.Generic.IList 1[System.Collections.Generic.IList1 [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
Run Code Online (Sandbox Code Playgroud)
那么,是否不可能以这种方式使用泛型和接口?只要我没有嵌套它就可以正常工作.
是的,有可能创造一个IList(Of IList(Of String))- 但List(Of (List(Of String)) 不是一个.考虑到后一种情况你可以打电话
listOfLists.Add(arrayOfStrings)
Run Code Online (Sandbox Code Playgroud)
作为字符串数组实现IList(Of String).
基本上这与考虑一个IList(Of Fruit)和一个List(Of Banana)- 一堆香蕉不是一个水果碗完全相同,因为你不能添加一个苹果.
在您的情况下,您需要创建一个List(Of IList(Of String))- 或声明一个IList(Of List(Of String)).
现在,有趣的是,你可以使用List(Of List(Of String))作为IEnumerable(Of IEnumerable(Of String))在.NET 4中,由于一般的协方差和逆变 - IEnumerable(Of T)是协变T.但是,IList(Of T)是不变的.
通用协方差和逆变是一个棘手的话题.Eric Lippert 写了很多关于它的内容 - 使用C#作为语言而不是VB,但希望你仍然可以理解它.