8

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

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

编辑:为了清楚起见,假设您不能更改方法签名本身(预定义的方法,由某些第 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 的事件和运算符。

4

2 回答 2

20

嗯...它在 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方法。这些方法非常有能力采用普通数组 - 因此您可以将您的委托类型声明为普通类型,并且仍然创建引用这些方法的委托实例,完全没有问题。委托类型仅影响您调用委托的方式。

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

于 2010-04-14T18:57:22.453 回答
0

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

于 2010-04-14T18:55:53.013 回答