namespace MyNamespace
{
public struct MyStruct
{
public string MyString;
public int MyInt;
public bool MyBool;
}
public class MyClass
{
private List<MyStruct> MyPrivateVariable;
public List<MyStruct> MyVariable
{
get
{
if (MyPrivateVariable == null)
{
MyPrivateVariable = new List<MyStruct>();
MyPrivateVariable.Add(new MyStruct());
MyPrivateVariable.Add(new MyStruct());
}
return MyPrivateVariable;
}
}
public void MyLoop()
{
foreach (MyStruct ms in MyVariable)
{
// Doesn't compile, but it works if you execute it through the Immediate window, or in Quickwatch
ms.MyBool = false;
// Compiles, works
MyFunction(ms);
}
}
public void MyFunction(MyStruct ms)
{
ms.MyBool = false;
}
}
}
Есть разумные объяснения этому?
Компилятор возвращает:
Ошибка: невозможно изменить элементы «ms», поскольку это «переменная итерации foreach».
ИЗМЕНИТЬ:
Дополнительный вопрос:
Я только что попытался изменить строку с MyFunction, и на самом деле она не обновляет ms. НО: если я зайду в quickwatch и назначу там то же значение, оно обновит ms. Почему это происходит, если он вообще не должен компилироваться, не должен ли quickwatch выдавать исключение?
EDIT2:
Хорошо, быстрый просмотр также работает с копией ms, поэтому я могу редактировать его значение, на самом деле это не меняет содержимое MyPrivateVariable.
MyVariable, то он не сработает. - person recursive   schedule 24.09.2010