2009-07-16 16 views
29

Mi piacerebbe definire un delegato che richiede un paio di date, un numero sconosciuto di altri parametri (usando la parola chiave params) e che restituisce un elenco di oggetti;È possibile utilizzare la parola chiave params in un delegato?

Func<DateTime, DateTime, params int[], List<object>> 

A Visual Studio non piace la sintassi che mi fa pensare che questo non è consentito. Qualcuno può dirmi perché?

risposta

21

Non si può avere attributi personalizzati su un argomento di tipo generico (CLI non lo permette) e il compilatore C# implementa la parola chiave params emettendo lo System.ParamArrayAttribute sul parametro del metodo rilevante.

Questo ti impedisce di utilizzarlo con System.Func <...> delegati generici, ma puoi sempre creare il tuo tipo di delegato che utilizza params.

42

Non è possibile utilizzare parametri per qualsiasi parametro diverso da quello precedente ... questo fa parte di ciò che si lamenta.

Non è inoltre possibile utilizzare params in un argomento di tipo. Questo non è solo per i delegati, ma in generale. Ad esempio, non è possibile scrivere:

List<params string[]> list = new List<params string[]>(); 

È possibile, tuttavia, dichiarare un nuovo tipo delegato , in questo modo:

delegate void Foo(int x, params string[] y); 

... 

Foo foo = SomeMethod(); 
foo(10, "Hi", "There"); 

Nota che la conversione metodo di gruppo dovrà corrispondere un metodo che prende una matrice di stringhe - non si poteva dichiarare SomeMethod come:

void SomeMethod(int x, string a, string b) 

e si aspettano quanto sopra per lavorare, per esempio. Dovrebbe essere:

void SomeMethod(int x, string[] args) 

(. Oppure potrebbe usare params stesso, ovviamente)

Problemi correlati