2009-09-20 8 views

Antwort

16

du schreiben kann, zum Beispiel

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

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

Wenn Sie etwas ein bisschen flexibler als ein spezifischer delegieren müssen, versuchen Sie dann an den Delegierten, einen Blick auf diese Frage in der Antwort definiert: http://stackoverflow.com/questions/1184329/function-pointers -in-c –

0

Es ist sicherlich möglich, eine Liste eines bestimmten Delegattyp zu erstellen, wie Aktion oder Func oder andere. Da anonyme Delegaten für jeden Delegattyp mit einer kompatiblen Signatur umgewandelt werden können, können Sie eine Liste mit Delegaten erstellen, sofern sie über kompatible Signaturen verfügen.

Ich glaube nicht, dass das Erstellen einer Liste von Delegaten mit mehreren Arten von Signaturen von großem Nutzen wäre, da eine nicht spezifizierte Signatur es sehr schwer machen würde, einen Delegierten anzurufen. Sie sollten dies jedoch mit Nachdenken tun können. In diesem Fall können Sie einfach eine Objektliste verwenden.

3

Das Problem mit Ihrem Code ist, dass Sie versuchen, eine Instanz als ein Typ-Argument für List anzugeben.

Action<int> method ist eine Instanz, während Action<int> ein Typ ist.

Wie ein anderes Plakat erwähnt, müssen Sie nur den Typ der Liste als Action<int> deklarieren, das heißt, nur mit dem Typ Parameter.

z.B.

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

Warum ist es verpönt? – recursive

+0

Einige Leute denken, dass diese Art von Listenergänzungen nicht mit Operationen verwendet werden sollte, die Nebenwirkungen haben. Jede dieser Methoden hat inhärent Nebenwirkungen. – Joren

+0

@ Joren: Verwenden von LINQ-Ausdrücke (einschließlich Verständnis Ausdrücke) nur für Nebenwirkungen ist problematisch, wegen ihrer faulen Natur. Aber anonyme Methoden und Lambda-Ausdrücke sind nicht nur für LINQ, und es gibt keinen Grund, sie auf rein funktionale im Allgemeinen zu beschränken. Also, IMO, die Verwendung eines Lambda mit 'List .Each()' ist ein guter Ansatz. – Richard

Verwandte Themen