当T是ByRef时,如何传递Action(Of T)

时间:2017-03-16 21:57:49

标签: vb.net

BYVAL:

Public Sub foo()
    bar(AddressOf baz)
End Sub

Public Sub bar(ByVal numFun As Action(Of Integer))

End Sub

Public Sub baz(ByVal num As Integer)

End Sub

的ByRef:

Public Sub foo()
    bar(AddressOf baz)
End Sub

Public Sub bar(ByVal numFun As Action(Of Integer))

End Sub

Public Sub baz(ByRef num As Integer)
    ' num has been changed to ByRef above ^^^
End Sub

以上情况很好,没有错误。但是,如果参数更改为ByRef,如下所示,则会引发以下错误:

  

错误:方法'Public Sub baz(ByRef Integer)'没有   签名与代表'公共代表子行动(In   整数)(整数)'

它在错误中给出的签名与我所拥有的签名不匹配 - 什么是“(Of Of Integer)(整数)”?我没有实例化任何东西。为什么“在”?无论如何,我真正追求的是如何使这项工作。我不能改变必须保留的ByRef。

***注意:我知道我可以创建一个显式委托,但我不想因为我在整个代码中有几个这个问题的实例,这似乎是不必要的开销。

非常感谢提前

1 个答案:

答案 0 :(得分:2)

Delegate Sub MyAction(Of T)(ByRef num As T)

Public Sub foo()
    bar(AddressOf baz)
End Sub

Public Sub bar(numFun As MyAction(Of Integer))

End Sub

Public Sub baz(ByRef num As Integer)
    ' num has been changed to ByRef above ^^^
End Sub

<强>更新

无法宣布您的ByRef Delegate。这是System.Action(Of T)

的定义
Public Delegate Sub Action(Of In T)(obj As T)

因此您无法将System.Action用于ByRef参数,因为它已被声明为ByVal