代表和ParamArray - 解决方案建议?

时间:2010-04-14 18:50:36

标签: vb.net delegates method-signature paramarray

某些预定义方法的签名中包含ParamArray。 但是,代表们不能在签名中包含ParamArray。

问题:假设您希望为需要ParamArray的特定方法创建委派机制。你会如何解决这个约束?

编辑:只是为了说清楚,假设你不能自己改变方法签名(预定义的方法,由某些第三方定义,无论是否是微软)。

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的事件和操作符。

2 个答案:

答案 0 :(得分:19)

嗯......它适用于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 Sub Foo(ParamArray ByVal args() As String)

给出:

  

错误BC33009:'委托'参数不能声明为'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方法。这些方法非常能够使用普通数组 - 因此您可以将委托类型声明为正常,并且仍然创建了委托实例,这些实例完全没有问题地引用这些方法。委托类型仅影响您调用委托的方式。

除了使用参数数组声明委托类型之外,我真的不知道问题是什么。

答案 1 :(得分:0)

您确定代表不支持ParamArray吗?好吧,即使他们不这样做,ParamArray也是普通旧数组的语法糖。将参数定义为数组,即它。