Il s'agit d'un bogue que j'avais signalé sur le site Web de Microsoft Connect. Microsoft l'a déjà corrigé dans la prochaine édition de .NET, comme indiqué dans le lien suivant.
List.ForEach permet l'énumération sur une version modifiée de List
Ce n'est probablement pas directement lié à la réponse mais c'est assez drôle de ce que je viens de découvrir.
ForEach, supprimer (travaux)
List<int> list = new List<int>(){ 1, 2, 3, 4, 5, 6};
list.ForEach(x => {
Console.WriteLine(x);
list.Remove(x);
});
foreach, delete (accidents)
// throws exception
foreach (var x in list)
{
Console.WriteLine(x);
list.Remove(x);
}
ForEach, insérer (...)
// goes in infinite loop...
list.ForEach(x => {
list.Add(1);
});
foreach, insert (accidents)
// throws exception
foreach (var x in list)
{
Console.WriteLine(x);
list.Add(x);
}
Donc tous ceux qui parlent ici de mutabilité ou de différentes couches de confusion, etc., je pense qu'il s'agit d'une fonctionnalité complètement à moitié implémentée par Visual Team car l'énumération posera toujours des problèmes si la collection est modifiée.
Malgré les arguments, je ne vois toujours pas pourquoi ForEach devrait permettre des modifications, il est purement utilisé pour l'énumération et cela ne fait aucune différence que ce soit la syntaxe foreach(var item in x) ou x.ForEach(x=>{}).
Je ne suis pas d'accord avec Eric, je vois simplement que l'équipe de la BCL a implémenté cette fonctionnalité sur IEnumerable et que list.ForEach est défectueux.
"Pourquoi" est complètement subjectif, par exemple, Silverlight a ajouté des algorithmes de hachage complexes et a laissé MD5 derrière lui alors que partout ailleurs nous utilisons MD5 si largement. Il s'agit plutôt de savoir à quel point une chose est demandée et qui est celui qui choisit de l'inclure ou non dans le framework.
Il n'y a aucune raison logique ou philosophique de ne pas avoir ForEach dans IEnumerable. Il y a beaucoup de points manquants de ce genre qui, je pense, seront améliorés par .NET avec le temps.