J'essaie de parcourir tous les composants et pour ceux qui implémente ISupportsOpen permettre d'ouvrir un projet. Le problème est lorsque la méthode anonyme est appelée, la variable composant est toujours le même élément (comme provenant du champ extérieur de IEnumerable)C# Anonyme problème de portée variable avec IEnumerable <T>
foreach (ISupportsOpen component in something.Site.Container.Components.OfType<ISupportsOpen>())
{
MyClass m = new MyClass();
m.Called += new EventHandler(delegate(object sender, EventArgs e)
{
if (component.CanOpenProject(..)) component.OpenProject(..);
});
itemsList.Add(m);
}
Comment devrait-il être résolu, s'il vous plaît?
Je suis juste curieux, pourquoi le run-time ne garde-t-il pas cette instance en mémoire quand il sait que l'instance est utilisée? Pourquoi le délégué a-t-il capturé la même variable? –
@ PaN1C_Showt1Me: La spécification de langage définit 'foreach' en termes d'une seule variable; cette variable est capturée, donc tout fonctionne selon la spécification. (C'est une chose de langue plutôt qu'une chose d'exécution.) Voir l'article de blog d'Eric (lié) pour plus de détails. Je suis sûr que si les concepteurs de langage avaient une machine à remonter le temps, ils changeraient le comportement de foreach - mais il est trop tard maintenant. –