2009-06-20 6 views

Antwort

11

Sie können Verwendung anonyme Funktionen, die Sie gerade sie zuerst werfen müssen:

dynamic list = new List<string>() { "10", "20" }; 
dynamic converted = list.ConvertAll((Func<string, int>) (x => int.Parse(x))); 

Das gleiche gilt für Verfahren Gruppenumwandlungen:

foo.Click += (EventHandler) MyClickHandler; 

Andere Einschränkungen ich gestoßen bin so weit:

  • Statische Methoden und Konstruktoren können nicht dynamisiert werden c in Bezug auf die Art, aber kann in Bezug auf die Argumente dynamisch sein
  • Sie nicht dynamic in einer Art Zwang
  • Sie können in einer Schnittstelle für eine nicht dynamic als Typargument verwenden können Klassendeklaration, aber man kann es als Basisklasse für eine Typargument verwenden, dh

    class Invalid : IEnumerable<dynamic> 
    class Valid : List<dynamic> 
    
  • Erweiterungsmethoden sind zur Ausführungszeit nicht auffindbar (aber man kann die statische Methode direkt mit dynamischen Argumente aufrufen)

  • Es gibt einen Fehler in 4.0b1, so dass Sie nicht von dynamic[] zu IEnumerable<dynamic> konvertieren können - das wird für die Veröffentlichung behoben werden.
  • Sie können nicht dynamic als Basisklasse verwenden

(Beachten Sie, dass diese Einschränkungen von C 4.0 # so viel wie der DLR selbst. Ich habe den Eindruck bekam, das war das, was Sie aber gemeint.)

+0

Großartig, gut, um eine Antwort von Ihnen zu bekommen :) – amazedsaint

+1

Nicht alle Verwendungen von Delegierten brauchen die Besetzung, nicht nur Anons/Lambdas? z.B. in btn.Click + = MyClickHandler; Wenn btn dynamisch ist, aber ein Click-Ereignis hat, funktioniert das nicht. Sie benötigen den Cast um den Namen der MyClickHandler-Methode. –

+0

@Earwicker: Nicht * alle * Verwendungen von Delegaten, aber Sie haben Recht, dass Methodengruppenkonvertierungen ebenfalls eine Umwandlung erfordern. Wird meine Antwort entsprechend aktualisieren. –

Verwandte Themen