是否可以使用IList(Of IList(Of String))?

时间:2011-08-02 18:42:06

标签: vb.net string list generics interface

我正在尝试使用一个只是字符串列表列表的变量。 我已经宣布如下:

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

那么,是否不可能以这种方式将泛型与接口一起使用?只要我没有嵌套它就可以正常工作。

3 个答案:

答案 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