0

这对我来说绝不是一个严重的问题,因为我已经解决了它,但我对差异以及为什么一个编译而另一个不会编译更感兴趣。请看以下示例:

这建立了。

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而不是IList的参数调用Bar吗?

4

2 回答 2

2

这是因为当它被传入 ByRef 时,参数必须能够接受函数想要放入的任何内容。在您的第一个示例中,如果函数决定执行类似...

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

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

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

于 2013-08-28T14:04:41.457 回答
0

ByRef 扩展了被调用函数的范围以包含被调用函数的 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
于 2013-08-28T15:14:16.150 回答