实例化列表作为有效的IList参数

时间:2013-08-28 13:45:04

标签: vb.net

这对我来说绝不是一个严重的问题,因为我已经解决了这个问题,但我对这种差异更加好奇,为什么要编译而另一个不会。请看下面的例子:

这构建。

Sub Foo()

   Dim someL as IList(Of Integer) = New List(Of Integer)
   Bar(someL)

End Sub

Sub Bar(ByRef argSomeL as IList(Of Integer))
'do stuff
End Sub

请注意,bar的参数是IList的参数。而SomeL是一个实际的List(Of Int) 以下内容无法编译:

Sub Foo()

   Dim someL as New List(Of Integer)
   Bar(someL)

End Sub

Sub Bar(ByRef argSomeL as IList(Of Integer))
   'do stuff
End Sub

他们不是两个(Foo())用List的参数调用Bar而不是IList吗?

2 个答案:

答案 0 :(得分:3)

这是因为当它在ByRef中传递时,参数必须能够接受函数想要放入的任何内容。 在你的第一个例子中,如果函数决定做某些事情......

argSomeL = New MikesListOfInts() ' Assuming MikesListOfInts implements IList(Of Integer)

它可以,并且调用函数中的变量some​​L可以设置为MikesListOfInts,因为它是IList类型。

但是,在你的第二个例子中,.Net将不知道如何将MikesListOfInts转换为List(Int)。

答案 1 :(得分:0)

ByRef扩展被调用函数的SCOPE以包含被调用函数的byref参数变量 - 即它允许更改被调用者的VARIABLE。

如果VB允许多个返回值,那几乎完全是多余的。

Dim local1 , local2 as int
(local1, local2) = Bar(local2)

这也暗示了你的例子的解决方案 - 不要使用byRef和sub,使用byval和函数。

Function Bar(ByVal foo As IList(of Integer)) As IList(of Integer)
   Return foo
End Function