2010-03-11 6 views
1

J'ai reçu une réponse à une question qui en a déclenché une autre, pourquoi le suivi ne fonctionne pas? Je ne comprends pas. Le compilateur dit: Impossible de convertir une méthode anonyme en chaîne. Mais pourquoi?Action <T> vs méthode anonyme question

public List<string> list = new List<string>(); 
    private void Form1_Load(object sender, EventArgs e) 
    {  
     a.IterateObjects(B); 
     // why this does not work: 
     a.IterateObjects(delegate(string a) { listBox1.Items.Add(a); }); 
    } 
    private void B(string a) 
    { 
     listBox1.Items.Add(a); 
    } 
    public void IterateObjects(Action<string> akce) 
    { 
     foreach (string a in list) 
     { 
      akce(a); 
     } 
    } 

Répondre

4

Vous avez une certaine confusion de variables. a est déjà déclarée ailleurs, si le changement:

a.IterateObjects(delegate(string a) { listBox1.Items.Add(a); }); 

à:

a.IterateObjects(delegate(string s) { listBox1.Items.Add(s); }); 

et il devrait fonctionner correctement.

+0

Mon dieu: D Merci! Silly, je cherchais ce qui me manquait (j'apprends juste ce truc) – Petr

0

Je pense que c'est parce que ListBoxItemCollection.Add renvoie effectivement un nombre entier. Donc ce serait un Func<string, int>, pas un Action<string>.

EDIT: Peu importe; Je suppose que puisque vous utilisiez une instruction delegate, vous auriez dû utiliser return pour qu'il soit évalué comme un objet semblable à Func.