vb.net - 当 T 是 ByRef 时如何传递一个 Action(Of T)

标签 vb.net

拜尔:

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

引用:

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,如下所示,它会抛出以下错误:

Error: Method 'Public Sub baz(ByRef Integer)' does not have a signature compatible with delegate 'Public Delegate Sub Action(Of In Integer)(Integer)'

它在错误中给出的签名与我所拥有的完全不匹配 - 什么是“(Of In Integer)(Integer)”?我没有实例化任何东西。为什么是“在”?无论如何,我真正想要的是如何使它工作。我无法更改必须保留的 ByRef。

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

提前致谢

最佳答案

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

关于vb.net - 当 T 是 ByRef 时如何传递一个 Action(Of T),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/42845519/

相关文章:

vb.net - 将 C# 转换为 VB.net 不起作用

mysql - 带有 mysql 的 Visual Basic 组合框

c# - Operator = 没有为类型 UIElement 和 UIElement 定义..?

asp.net - 在 VB.NET 的 Excel 单元格中限制粘贴 (Ctrl-V)

.net - VB.NET 2K8 : How to make all imports visible within a class?

vb.net - Silverlight中Prism MVVM的VB.net示例

html - GridView 未显示在 asp.net 网页中

vb.net - 在 VB.Net 中比较 Single 和 Double

vb.net - 如何忽略vb.net中的服务器错误?在C#中,您只需尝试/捕获并忽略然后异常

vb.net - 为什么 VB.NET 中的三元运算符接受 Nullable bool 值?