namespace MyNamespace
{
public struct MyStruct
{
public string MyString;
public int MyInt;
public bool MyBool;
}
public class MyClass
{
private List MyPrivateVariable;
public List MyVariable
{
get
{
if (MyPrivateVariable == null)
{
MyPrivateVariable = new List();
MyPrivateVariable.Add(new MyStruct());
MyPrivateVariable.Add(new MyStruct());
}
return MyPrivateVariable;
}
}
public void MyLoop()
{
foreach (MyStruct ms in MyVariable)
{
// Kompiliert nicht, funktioniert aber, wenn Sie es über das Immediate-Fenster oder in Quickwatch ausführen
ms.MyBool = false;
// Kompiliert, funktioniert
MyFunction(ms);
}
}
public void MyFunction(MyStruct ms)
{
ms.MyBool = false;
}
}
}
Eine vernünftige Erklärung dafür?
Der Compiler gibt zurück:
Fehler: Kann Elemente von 'ms' nicht ändern, weil es die 'foreach-Iteration Variable' ist
BEARBEITEN:
Zusätzliche Frage:
Ich habe gerade versucht, einen String von MyFunction
zu ändern, und er aktualisiert ms
tatsächlich nicht. ABER: Wenn ich in Quickwatch denselben Wert zuweise, aktualisiert es ms
. Warum passiert das, wenn es eigentlich gar nicht kompilieren sollte, sollte Quickwatch nicht eine Ausnahme auslösen?
BEARBEITEN2:
Okay, Quickwatch funktioniert auch auf einer Kopie von ms
, daher kann ich seinen Wert ändern, es ändert tatsächlich nicht den Inhalt von MyPrivateVariable
.