2010-04-14 22 views
6

Bazı önceden tanımlı yöntemler imzasında bir ParamArray içerir. Delegeler, imzalarında bir ParamArray içeremez.Delegeler ve ParamArray - Geçici Çözüm Önerileri?

Soru: Bir ParamArray gerektiren belirli bir yöntem için bir temsilci mekanizması oluşturmak istediğinizi varsayalım. Bu kısıtlamayı nasıl halledeceksin?

DÜZENLEME: sadece açıkça belirtmek için, yöntem imzalarını kendileri değiştiremezsiniz (önceden tanımlanmış yöntemler, 3. taraflarca tanımlanmış, Microsoft olsun ya da olmasın).

EDIT2: burada, sözdizimi şeker tutuyor gerçek anlaşma Aşağıdaki kod çalışır, ancak şeker ortadan kaldırır, çünkü:

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: Bu Skeet çözümleri oluşturmak için de uygulanabilir olduğu ortaya çıktı ParamArray içeren Olaylar ve Operatörler.

cevap

17

Hmm ... o C# çalışır

Delegate Sub Foo(ParamArray ByVal args() As String) 

verir:

hata BC33009: 'Temsilci' parametreleri 'ParamArray' olarak bildirilemez.

Meraklı. Neyse ki, o yuvarlak bir yol var:

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 

Temelde ben sadece elle ParamArrayAttribute uyguladık. İyi çalışıyor gibi görünüyor. Bununla birlikte, bunlardan hiçbiri halihazırda varolan ParamArray yöntemlerini kullanmamızı engelleyemezdi. Bu yöntemler, normal dizileri alma yeteneğine sahiptir - bu nedenle delege türlerinizi normal olarak ilan etmiş olabilirsiniz ve yine de bu yöntemlere hiç sorun yaşamayan delege örnekleri oluşturmuş olabilirsiniz. Temsilci türü yalnızca temsilci olarak nasıl arayacağınızı etkiler.

Bir parametre dizisiyle bir temsilci türünü bildirmekten başka, sorunun ne olduğunu gerçekten göremiyorum.

+0

Öznitelik eklemek için şeker kullanmıyorsanız, gayet iyi çalıştığını merak ediyorum ... saçma derleyici sınırlamaları FTL –

+0

Bu özniteliğin bile var olduğunu asla bilmiyordum! –

+0

@Jon Skeet, haklısınız, burada tek gerçek konu sözdizimi şekerini tutuyordu, ve bu notayı bu soruya ekledim. Bir kez daha, efsane ismine kadar yaşıyor. Bunu çözdüğünüz için teşekkürler. –

0

Delegelerin ParamArray'ı desteklemediğinden emin misiniz? Tamam, olmasalar bile, ParamArray düz eski dizi için sözdizimi şekeridir. parametreyi dizi olarak tanımla, bu kadar. Ancak

using System; 

class Test 
{ 
    delegate void Foo(params string[] args); 

    static void Main() 
    { 
     Foo f = x => Console.WriteLine(x.Length); 

     f("a", "b", "c"); 
    } 
} 

haklısın - VB eşdeğer temsilci bildirimi başarısız:

İlgili konular