Структуры являются типами значений.
Классы являются ссылочными типами.
ForEach
конструкция использует IEnumerator из IEnumerable элементы типа данных.Когда это происходит, переменные доступны только для чтения в том смысле, что вы не можете их изменять, и, поскольку у вас есть тип значения, вы не можете изменять любое содержащееся в нем значение, поскольку оно совместно использует одну и ту же память.
C #lang spec section 8.8.4:
Переменная итерации соответствует локальной переменной только для чтения с областью действия, которая распространяется на встроенный оператор
Для исправления этого класса использованиявместо структуры;
class MyStruct {
public string Name { get; set; }
}
Редактировать: @ CuiPengFei
Если вы используете var
неявный тип, компилятору будет труднее вам помочь.Если вы используете MyStruct
, в случае структуры вам будет сказано, что он доступен только для чтения.В случае классов ссылка на элемент доступна только для чтения, поэтому вы не можете писать item = null;
внутри цикла, но вы можете изменить его свойства, которые являются изменяемыми.
Вы также можете использовать (если вы хотите использоватьstruct
):
MyStruct[] array = new MyStruct[] { new MyStruct { Name = "1" }, new MyStruct { Name = "2" } };
for (int index=0; index < array.Length; index++)
{
var item = array[index];
item.Name = "3";
}