2009-09-20 13 views

risposta

16

È possibile scrivere questo, per esempio

 Action<int> method = j => j++; 
     List<Action<int>> operations = new List<Action<int>>(); 

     operations.Add(method); 
     operations.Add(i => i++); 
+0

Se avete bisogno di qualcosa di un po 'più flessibile di un delegato specifica, quindi provare ad avere uno sguardo al delegato definito nella risposta a questa domanda: http://stackoverflow.com/questions/1184329/function-pointers -in-c –

0

E 'certamente possibile creare un elenco di uno specifico tipo di delegato, come Azione o Func o altri. Poiché i delegati anonimi possono essere trasmessi a qualsiasi tipo di delegato con una firma compatibile, è possibile creare un elenco di delegati a condizione che abbiano firme compatibili.

Non penso che la creazione di un elenco di delegati con più tipi di firme sarebbe di grande utilità, poiché avere una firma non specificata renderebbe molto difficile chiamare un delegato. Dovresti essere in grado di farlo con la riflessione, però. In tal caso puoi semplicemente usare una lista di oggetti.

3

Il problema con il codice è che si sta tentando di specificare un'istanza come argomento di tipo su Elenco.

Action<int> method è un'istanza, mentre Action<int> è un tipo.

Come un altro poster menziona, è sufficiente dichiarare il tipo di elenco come Action<int>, ovvero con solo il parametro type.

ad es.

var myNum = 5; 

var myops = new List<Action<int>>(); 
myops.Add(j => j++); 
myops.Add(j => j++); 

foreach(var method in myops) 
{ 
    Console.WriteLine(method(myNum)); 
} 

// Frowned upon, but fun syntax 

myops.Each(method => method(myNum)); 
+0

Perché è malvisto? – recursive

+0

Alcune persone pensano che questo tipo di comprensione delle liste non dovrebbe essere usato con operazioni che hanno effetti collaterali. Ogni metodo come questo ha effetti collaterali. – Joren

+0

@Joren: l'uso di espressioni LINQ (comprese le espressioni di comprensione) solo per gli effetti collaterali è problematico, a causa della loro natura pigra. Ma i metodi anonimi e le espressioni lambda non sono solo per LINQ, e non c'è ragione di limitarli a essere puramente funzionali in generale. Quindi, IMO, l'uso di un lambda con 'Lista .Each()' è un buon approccio. – Richard

Problemi correlati