【问题标题】:Delegates and ParamArray - Workaround Suggestions?代表和 ParamArray - 解决方法建议?
【发布时间】:2010-04-14 18:50:35
【问题描述】:

一些预定义的方法在其签名中包含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 的事件和运算符。

【问题讨论】:

    标签: vb.net delegates method-signature paramarray


    【解决方案1】:

    嗯...它在 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:“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
    

    基本上我只是手动应用了ParamArrayAttribute。似乎工作正常。

    但是,无论如何,这些都不会阻止您使用现有的ParamArray 方法。这些方法非常有能力采用普通数组 - 因此您可以将您的委托类型声明为普通类型,并且仍然创建引用这些方法的委托实例,完全没有问题。委托类型只影响您调用委托的方式。

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

    【讨论】:

    • 我觉得有趣的是,如果您不使用糖来添加属性,它就可以正常工作...愚蠢的编译器限制 FTL
    • 从不知道该属性甚至存在!
    • @Jon Skeet,你说得非常对,这里唯一真正的问题是保留语法糖,我已将此注释添加到问题本身。再一次,这个传说不辜负它的名字。感谢您解决这个问题。
    【解决方案2】:

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

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2015-07-27
      • 2020-01-20
      • 2011-07-24
      • 1970-01-01
      相关资源
      最近更新 更多