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.List1[System.Collections.Generic.List
1[System.String]]”类型的对象强制转换为“System.Collections.Generic.IList1[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