意外更改列表的所有元素

Changing all elements of list by accident

我是 C# 编程的新手,这是我第一次 运行 遇到我无法解决的意外代码行为。

List<int[]> snakeCoords = new List<int[]>();
snakeCoords.Add(new int[2] { 25, 10 });
int direction = 0;
while (true)
{
    Move(direction);
}
void Move(int direction)
{
    int[] headCoords = new int[2];
    headCoords = snakeCoords.Last();

    switch (direction)
    {
        case 0:
            headCoords[1]--;
            snakeCoords.Add(headCoords);
            break;

    }

这段代码是我在Main{}中提取的,所以没有受到任何其他因素的影响,还是不行。结果是 snakeCoords.Count = 迭代次数,其中列表的每个元素都是 {25,(10 - 迭代次数)}。我期望和想要的结果是 {25,10}、{25,9}、{25,8} 等元素的列表。 我可以想到一些解决方法,但我真的很想了解这段代码的作用。

您丢弃分配给 headCoordsnew int[2] 并用列表中已有的数组覆盖它。换句话说,最后你在列表中有 10 个 same 数组的条目,所以每次修改都会反映在所有条目中,因为你每次都在修改一个相同的数组。

确保复制克隆数组,或将数组中的值复制到新数组,而不是重复使用同样的数组一次又一次。

修复将替换

int[] headCoords = new int[2];
headCoords = snakeCoords.Last();

int[] headCoords = (int[]) snakeCoords.Last().Clone();