8

一部の定義済みメソッドには、署名にParamArrayが含まれています。ただし、デリゲートの署名に ParamArray を含めることはできません。

質問: ParamArray を必要とする特定のメソッドの委任メカニズムを作成したいとします。この制約をどのように回避しますか?

EDIT:明確にするために、メソッドシグネチャ自体を変更できないと仮定します(Microsoftかどうかに関係なく、サードパーティによって定義された事前定義されたメソッド)。

EDIT2:次のコードは機能しますが、砂糖を排除するため、ここでの本当の取引は構文 sugar を維持することです:

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: '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ただし、とにかく既存のメソッドを使用することを止めることはありません。これらのメソッドは通常の配列を取ることができるため、デリゲート型を通常として宣言しても、これらのメソッドを参照するデリゲート インスタンスをまったく問題なく作成できます。デリゲートの種類は、デリゲートを呼び出す方法にのみ影響します。

パラメーター配列を使用してデリゲート型を宣言する以外に、問題が何であるかはわかりません。

于 2010-04-14T18:57:22.453 に答える
0

デリゲートは ParamArray をサポートしていませんか? そうでない場合でも、ParamArray は単純な古い配列の構文シュガーです。パラメータを配列として定義する、それだけです。

于 2010-04-14T18:55:53.013 に答える