首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >代表和ParamArray -变通建议?

代表和ParamArray -变通建议?
EN

Stack Overflow用户
提问于 2010-04-14 18:50:35
回答 2查看 3.7K关注 0票数 8

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

问题:假设您希望为需要ParamArray的特定方法创建委托机制。您将如何绕过这个约束?

编辑:为了说明清楚,假设您不能自己更改方法签名(由某个第三方定义的预定义方法,不管是Microsoft还是非Microsoft)。

EDIT2:这里真正的问题是保持语法糖,因为下面的代码确实有效,但是消除了糖:

代码语言:javascript
复制
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的事件和操作符。

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2010-04-14 18:57:22

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

代码语言:javascript
复制
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中的等效委托声明失败了:

代码语言:javascript
复制
Delegate Sub Foo(ParamArray ByVal args() As String)

给予:

错误BC33009:“委托”参数不能声明为“ParamArray”。

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

代码语言:javascript
复制
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方法。这些方法能够很好地接受普通数组--因此您可以将您的委托类型声明为普通类型,并且仍然可以创建引用这些方法的委托实例,而不存在任何问题。委托类型仅影响如何调用委托。

除了使用参数数组声明委托类型之外,我不太清楚问题是什么。

票数 20
EN

Stack Overflow用户

发布于 2010-04-14 18:55:53

您确定委托不支持ParamArray吗?好吧,即使它们没有,ParamArray对于普通的旧数组来说是语法上的糖。将参数定义为数组,仅此而已。

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/2640145

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档