2009-06-20 6 views

Répondre

11

Vous peut utiliser les fonctions anonymes, il vous suffit de les jeter d'abord:

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

en est de même des conversions de groupe méthode:

foo.Click += (EventHandler) MyClickHandler; 

D'autres restrictions que j'ai rencontré si loin:

  • Les méthodes statiques et les constructeurs ne peuvent pas être dynami c en termes de type, mais peut être dynamique en fonction des arguments
  • Vous ne pouvez pas utiliser dynamic dans une contrainte de type
  • Vous ne pouvez pas utiliser dynamic comme un argument de type dans une interface pour une déclaration de classe, mais vous pouvez l'utiliser comme un argument de type pour une classe de base, à savoir

    class Invalid : IEnumerable<dynamic> 
    class Valid : List<dynamic> 
    
  • les méthodes d'extension ne sont pas découvrable au moment de l'exécution (mais vous pouvez appeler la méthode statique directement avec des arguments dynamiques)

  • Il ya un bug dans 4.0b1 tel que vous ne pouvez pas convertir de dynamic[] à IEnumerable<dynamic> - qui sera corrigé pour la version.
  • Vous ne pouvez pas utiliser dynamic comme une classe de base

(Notez que ce sont les limites de 4.0 C#, autant que du DLR lui-même. J'ai eu l'impression que est ce que vous vouliez dire bien.)

+0

Très bien, bon d'avoir une réponse de votre part :) – amazedsaint

+1

Les délégués n'ont-ils pas tous besoin de la distribution, pas seulement des anons/lambdas? par exemple. dans btn.Click + = MyClickHandler; si btn est dynamique mais possède un événement Click, cela ne fonctionnera pas. Vous avez besoin de la distribution autour du nom de la méthode MyClickHandler. –

+0

@Earwicker: Pas * toutes * les utilisations des délégués, mais vous avez raison de dire que les conversions de groupes de méthodes nécessitent également une conversion. Mettra à jour ma réponse en conséquence. –

Questions connexes