M.A*_*nin 6 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
Run Code Online (Sandbox Code Playgroud)
EDIT3:事实证明,Skeet的解决方案也适用于创建包含ParamArray的事件和操作符.
Jon*_*eet 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");
}
}
Run Code Online (Sandbox Code Playgroud)
但是,你是对的 - VB中的等效委托声明失败:
Delegate Sub Foo(ParamArray ByVal args() As String)
Run Code Online (Sandbox Code Playgroud)
得到:
错误BC33009:'Delegate'参数不能声明为'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
Run Code Online (Sandbox Code Playgroud)
基本上我只是ParamArrayAttribute手动应用.似乎工作正常.
但是,这些都不会阻止您使用现有ParamArray方法.这些方法非常能够使用普通数组 - 因此您可以将委托类型声明为正常,并且仍然创建了委托实例,这些实例完全没有问题地引用这些方法.委托类型仅影响您调用委托的方式.
除了声明带有参数数组的委托类型之外,我真的不知道问题是什么.