Это потому, что foreach предназначен для итерации по контейнеру, чтобы каждый элемент посещался ровно один раз, без изменения контейнера, чтобы избежать неприятных побочных эффектов.
См .: foreach в MSDN
Если вы имели в виду, почему изменения в элементе, таком как целое число, не влияют на контейнер целых чисел, это потому, что переменная итерации в этом случае будет типом значения и копируется, например:
// Warning: Does not compile
foreach (int i in ints)
{
++i; // Would not change the int in ints
}
Даже если переменная итерации была ссылочным типом, чьи операции возвращали новый объект, вы не изменили бы исходную коллекцию, вы просто переназначили бы эту переменную большую часть времени:
// 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
}
В следующем примере можно реально изменить объект в исходной коллекции, вызвав метод мутирующий :
// Warning: Does not compile
foreach (MyClass ob in objs)
{
ob.ChangeMe(); // This could modify the object in the original collection
}
Во избежание путаницы в отношениизначение по сравнению со ссылочными типами и сценариями, упомянутыми выше (наряду с некоторыми причинами, связанными с оптимизацией), MS решила сделать тПеременная итерации readonly
.