Questo è dovuto al fatto foreach è pensato per iterare su un contenitore, assicurandosi che ogni elemento viene visitata una sola volta, senza cambiare il contenitore, per evitare brutte effetti collaterali.
See: foreach in MSDN
Se volevi dire perché dovrebbero modifiche a un elemento come un intero non pregiudica un contenitore di numeri interi, e questo è perché la variabile di iterazione in questo caso sarebbe un tipo di valore ed è copiato, ad esempio:
// Warning: Does not compile
foreach (int i in ints)
{
++i; // Would not change the int in ints
}
Anche se la variabile di iterazione è stato un tipo di riferimento, la cui attività ha restituito un nuovo oggetto, non sarebbe cambiare la collezione originale, si sarebbe solo essere riassegnando a questa variabile maggior parte del tempo:
// Warning: Does not compile
foreach (MyClass ob in objs)
{
ob=ob+ob; // Reassigning to local ob, not changing the one from the original
// collection of objs
}
Il seguente esempio ha il potenziale di modificare effettivamente l'oggetto nell'insieme originale chiamando il metodo mutante:
// Warning: Does not compile
foreach (MyClass ob in objs)
{
ob.ChangeMe(); // This could modify the object in the original collection
}
Per evitare confusione in relazione al valore vs tipi di riferimento e gli scenari di cui sopra (insieme ad alcune ragioni legate all'ottimizzazione), MS ha scelto di rendere la variabile di iterazione readonly
.
fonte
2010-10-23 15:46:04
Cosa significa essere di sola lettura dal ciclo while? Il ciclo while è un costrutto; non è né di sola lettura né di lettura-scrittura. Potresti forse postare del codice e/o chiarire la tua domanda, per favore? Grazie. – CesarGon
Penso che stia parlando della variabile di iterazione, come in foreach (Item theItem in theItemList) ... l'oggetto non può essere assegnato a. –
Ha chiarito la domanda ora: sta parlando di foreach piuttosto che mentre. – CesarGon