vb.net - 委托(delegate)和 ParamArray - 解决方法建议?

标签 vb.net delegates method-signature paramarray

一些预定义的方法包含 ParamArray在他们的签名中。
但是,委托(delegate)不能在其签名中包含 ParamArray。

问题:假设您希望为需要 ParamArray 的特定方法创建委托(delegate)机制。你将如何解决这个限制?

编辑:为了清楚起见,假设您不能更改方法签名本身(预定义的方法,由某些第 3 方定义,无论是否是 Microsoft)。

EDIT2:这里真正的交易是保留语法糖 ,因为以下代码确实有效,但消除了糖:

Public Delegate Sub MyDelegate(ByVal myArgs() As Object)

Public Sub PredefinedSub(ByVal ParamArray myArgs() As Object)
    '...'
End Sub

Sub Test()
    Dim aDelegate As New MyDelegate(AddressOf PredefinedSub)
    aDelegate.Invoke(New Object() {1, 2, 3, 4})
End Sub

EDIT3:事实证明,Skeet 的解决方案也适用于创建包含 ParamArray 的事件和运算符。

最佳答案

嗯...它在 C# 中工作:

using System;

class Test
{
    delegate void Foo(params string[] args);

    static void Main()
    {
        Foo f = x => Console.WriteLine(x.Length);

        f("a", "b", "c");
    }
}

但是,您是对的 - VB 中的等效委托(delegate)声明失败:
Delegate Sub Foo(ParamArray ByVal args() As String)

给出:

error BC33009: 'Delegate' parameters cannot be declared 'ParamArray'.



好奇的。幸运的是,有一种方法可以绕过它:
Imports System

Public Class Test

    Delegate Sub Foo(<[ParamArray]()> ByVal args() As String)

    Public Shared Sub Main()
        Dim f As Foo = AddressOf PrintLength
        f("a", "b", "c")
    End Sub

    Private Shared Sub PrintLength(ByVal x() As String)
        Console.WriteLine(x.Length)
    End Sub

End Class

基本上我刚刚申请了 ParamArrayAttribute 手动。似乎工作正常。

但是,这些都不会阻止您使用现有的 ParamArray反正方法。这些方法非常有能力采用普通数组 - 因此您可以将您的委托(delegate)类型声明为普通类型,并且仍然创建引用这些方法的委托(delegate)实例,完全没有问题。委托(delegate)类型仅影响您调用委托(delegate)的方式。

除了用参数数组声明委托(delegate)类型之外,我真的不明白问题出在哪里。

关于vb.net - 委托(delegate)和 ParamArray - 解决方法建议?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/2640145/

相关文章:

Java - 获取接口(interface)中方法的签名,其代理实现也是如此

c# - VB.Net 和 C# 之间 LINQ 语法的差异

.net - 向后台工作人员传递值和从后台工作人员传递值

javascript - 使用 JavaScript/JQuery 通过 AJAX 传递数组

ios - 使用委托(delegate)和 UITabBarController 转发数据

c# - control.BeginInvoke() 与 Dispatcher 与 SynchronizationContext 与 .. - 可靠性

c# - 报表查看器文本框可见性表达式

ios - View Controller 值传递

c# - 任何方法类型的委托(delegate) - C#

java - 关于 Netty 的 Channel.write(Object) 签名的问题 - Unclear documentation