一些预定义的方法包含 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/