66 votes

Pourquoi ne pouvons-nous #39 pas attribuer une variable d’itération foreach, alors que nous pouvons la modifier complètement avec un accesseur ?

J’étais juste curieux à ce sujet: le code suivant ne sera pas compilé, car nous ne pouvons pas modifier une variable d’itération foreach:

Mais les éléments suivants seront compilés et exécutés :

Pourquoi le premier est-il invalide, alors que le second peut faire la même chose en dessous (je cherchais l’expression anglaise correcte pour cela, mais je ne m’en souviens pas. Sous le...? ^^ )

45voto

Mohamed Abed Points 2951

foreach est un itérateur en lecture seule qui itéra dynamiquement les classes qui implémentent IEnumerable, chaque cycle dans foreach appellera IEnumerable pour obtenir l’élément suivant, l’élément que vous avez est une référence en lecture seule, vous ne pouvez pas le ré-affecter, mais simplement appeler `` y accède et attribue une certaine valeur à un attribut de lecture/écriture tout en restant la référence de l’élément une référence en lecture seule.

28voto

James Johnson Points 29414

Vous ne pouvez pas modifier une collection pendant qu’elle est énumérée. Le deuxième exemple ne met à jour qu’une propriété de l’objet, ce qui est entièrement différent.

Utilisez une `` boucle si vous devez ajouter/supprimer/modifier des éléments d’une collection :

13voto

Wouter de Kort Points 17184

Si vous regardez la spécification de langue, vous pouvez voir pourquoi cela ne fonctionne pas:

Les spécifications indiquent qu’un foreach est étendu au code suivant :

Comme vous pouvez le voir, l’élément actuel est utilisé pour appeler MoveNext() on. Ainsi, si vous modifiez l’élément actuel, le code est « perdu » et ne peut pas itérer sur la collection. Donc, changer l’élément en quelque chose d’autre n’a aucun sens si vous voyez quel code le compilateur produit réellement.

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X