2010-04-14 52 views
6

某些預定義的方法在其簽名中包含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 

EDIT3:事實證明,飛碟雙向的解決方案也適用於創建包含ParamArray的事件和操作符。

回答

17

嗯......它工作在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:'委託'參數不能被聲明'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方法。這些方法非常適合正常的數組 - 因此您可以將委託類型聲明爲普通數據類型,並且仍然創建委託實例,這些實例根本沒有任何問題引用這些方法。委託類型僅影響您將如何調用委託。

除了用參數數組聲明一個委託類型,我真的不知道問題是什麼。

+0

我覺得它很有趣,如果你不使用糖來添加屬性,它就可以工作......愚蠢的編譯器限制FTL – 2010-04-14 19:12:29

+0

甚至不知道該屬性存在! – 2010-04-14 19:17:40

+0

@Jon Skeet,你說得很對,這裏唯一真正的問題是保持語法糖,並且我已經將這個註釋添加到了問題本身。 再次,傳說不辜負它的名字。謝謝你解決這個問題。 – 2010-04-14 19:20:04

0

您確定代表不支持ParamArray嗎?好的,即使他們不這樣做,ParamArray是普通舊數組的語法糖。將參數定義爲數組,就是這樣。

相關問題