我有一个带有名为“rcnesw”的迭代变量的 foreach 语句。
foreach( RCNESW rcnesw in shiftersave )
{
TestG.ShiftQuad( rcQuads, rcnesw.row, rcnesw.col, GO_.Up);
// other code...
}
在调试调用 ShiftQuad 后 rcnesw.row 和 rcnesw.col CHANGE 的值时——我认为 foreach 循环变量是只读的。它永远不是只读的吗?
注意:TestG.ShiftQuad 方法中还有一个 foreach 循环,它有自己的本地(我认为是本地)变量,该变量具有完全相同的名称和类型:RCNESW rcnesw。该值似乎传输回调用 foreach 位置。
(=====编辑=====添加=====)
首先,感谢大家提供有关“只读”变量的“可变”性质的信息。这说明了情况(C#/.NET 文档没有说明)。
关于 ShiftQuad 方法的更多信息,它是:
public void ShiftQuad( List<RCPair> rcList, int row, int col, int dir )
并且在该方法中没有改变行或列。 ShiftQuad 声明自己的 rcnew:
RCNESW rcnesw = null;
或者是吗?该语句不会创建 RCNESW 的新实例吗?因为当该方法使 rcnesw.row 和 rcnesw.col 发生变化时,调用方法显然会接收到这些变化。
public class RCNESW
{
public int row;
public int col;
public bool bNorth;
public bool bEast;
public bool bSouth;
public bool bWest;
}
在这一点上我仍然认为这是一个编译器错误。对局部变量的更改不应通过按值调用的变量出现在调用者处。
(====编辑====已解决===) 这个问题实际上与本地与非本地(或按值传递)无关,问题在于某些列表如何成为相同对象的别名。
最佳答案
每当您在 C# 中遇到只读概念时,它几乎总是只读的浅层形式 - 您无法更改变量引用的哪个对象,但您可以更改该对象的自己的属性(或对其调用方法等)
这同样适用于类的 readonly
字段 - 您不能更改引用,但可以改变对象。
关于c# - foreach 迭代变量不能因为任何原因而改变吗?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/20703050/