这对我来说绝不是一个严重的问题,因为我已经解决了这个问题,但我对这种差异更加好奇,为什么要编译而另一个不会。请看下面的例子:
这构建。
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吗?
答案 0 :(得分:3)
这是因为当它在ByRef中传递时,参数必须能够接受函数想要放入的任何内容。 在你的第一个例子中,如果函数决定做某些事情......
argSomeL = New MikesListOfInts() ' Assuming MikesListOfInts implements IList(Of Integer)
它可以,并且调用函数中的变量someL可以设置为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