Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/string/5.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Vb.net 可以使用IList(Of IList(Of String))吗?_Vb.net_String_List_Generics_Interface - Fatal编程技术网

Vb.net 可以使用IList(Of IList(Of String))吗?

Vb.net 可以使用IList(Of IList(Of String))吗?,vb.net,string,list,generics,interface,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 然后,我尝试将其作为参数传递给另一个方法,我对该方法的定义如下:

我试图使用一个变量,它只是一个字符串列表。 我声明如下:

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
然后,我尝试将其作为参数传递给另一个方法,我对该方法的定义如下:

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

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

首先声明如下IROW:

Dim iRows As New List(Of IList(Of String))

然后,当您将
新列表(字符串)
添加到
iRows
时,它将相应地隐式强制转换。

首先声明iRows,如下所示:

Dim iRows As New List(Of IList(Of String))

然后,当您将
新列表(字符串)
添加到
iRows
时,它将相应地隐式强制转换。

尝试以下更改:

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

尝试以下更改:

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

不存在需要从<代码>列表>代码>到<代码> IIST .< /P> < P>是的,可以创建<代码> IList(IList(String))< /C> >但(不是<代码> >列表。考虑到在后一种情况下,您可以调用

listOfLists.Add(arrayOfStrings)
作为字符串数组实现
IList(字符串的)

基本上,这与考虑一个
IList(水果)
和一个
列表(香蕉)
是完全一样的——一堆香蕉不是一个水果碗,因为你不能在里面加一个苹果

在您的情况下,您需要创建一个
List(Of-IList(Of-String))
,或者声明一个
IList(Of-List(Of-String))

现在有趣的是,您可以在.NET4中使用
List(Of List(Of String))
作为
IEnumerable(Of IEnumerable(Of String))
,这是由于泛型协方差和逆方差-
IEnumerable(Of T)
T
中是协变的。然而,
IList(Of T)
是不变的

通用协变和逆变是一个棘手的话题。Eric Lippert使用C#而不是VB作为语言,但希望你仍然能理解它。

是的,可以创建一个
IList(Of IList(Of String))
-但是一个
列表(Of(Of String))不是一个。考虑到后一种情况,你可以调用< /P>
listOfLists.Add(arrayOfStrings)
作为字符串数组实现
IList(字符串的)

基本上,这与考虑一个
IList(水果)
和一个
列表(香蕉)
是完全一样的——一堆香蕉不是一个水果碗,因为你不能在里面加一个苹果

在您的情况下,您需要创建一个
List(Of-IList(Of-String))
,或者声明一个
IList(Of-List(Of-String))

现在有趣的是,您可以在.NET4中使用
List(Of List(Of String))
作为
IEnumerable(Of IEnumerable(Of String))
,这是由于泛型协方差和逆方差-
IEnumerable(Of T)
T
中是协变的。然而,
IList(Of T)
是不变的


通用协变和逆变是一个棘手的话题。埃里克·利珀特(Eric Lippert)曾-使用C#而不是VB作为语言,但希望你仍然能理解它。

感谢你的热情,但这还不接近@Telarian的要求。感谢你的热情,但这甚至还不接近@Telarian的要求。这一切都让我们感到惊讶nse现在。谢谢。微软没有为IList实现一个IReadableList基类型真是太糟糕了,因为一个IReadableList(苹果的)可以被需要IReadableList(水果的)的代码使用。现在可能需要一些非常讨厌的运行时黑客来实现这样的东西,而不破坏现有的代码。@supercat:是的-它会很有用。这很棘手-太多的接口分解会导致混乱,但太少会导致这类事情:(@Jon Skeet:我真的不喜欢那些强烈期望许多实现不会处理所有成员的接口。IEnumerable.Reset非常难看。想象一下,如果有一个IMultipassEnumerable继承了IEnumerable,包括Reset,并保证使用同一枚举数的多个过程会产生identical数据;IEnumerable的“约定”可能会被削弱,以指定如果在枚举过程中更改了集合,则枚举器可以返回“合理”数据或引发异常;ILiveEnumerable将继承IEnumerable,但……指定即使修改了集合,它也应返回合理数据(而不是抛出异常),IPurgeableEnumerable将提供一个PurgeForAll方法,该方法将调用每个元素上的函数并删除函数返回true的所有项(通常需要这种模式,但如果没有枚举器中的支持,很难实现这种模式)。现在一切都讲得通了。谢谢。微软没有为IList实现一个IReadableList基类型真的太糟糕了,因为一个IReadableList(苹果的)可以被期望一个IReadableList(水果的)的代码使用。现在可能需要一些非常讨厌的运行时黑客来实现这样的东西,而不破坏现有的代码。@supercat:是的-它会很有用。这很棘手-太多的接口分解会导致混乱,但太少会导致这类事情:(@Jon Skeet:我真的不喜欢那些强烈期望许多实现不会处理所有成员的接口。IEnumerable.Reset就是那么难看。Im