收到“ArgumentOutOfRangeException”错误,但不知道如何

本文关键字:不知道 错误 ArgumentOutOfRangeException 收到 | 更新日期: 2023-09-27 18:35:34

我的代码在循环访问列表时抛出一个超出范围的错误,但我不知道为什么。这是我的代码:

        for(int neighborCounter = neighborList.Count - 1; neighborCounter >= 0; neighborCounter--)
        {
            for(int toBeCheckedCounter = toBeChecked.Count - 1; toBeCheckedCounter >= 0; toBeCheckedCounter--)
            {
                Vector2 tile1 = neighborList[neighborCounter];
                Vector2 tile2 = toBeChecked[toBeCheckedCounter];
                if(tile1 == tile2)
                {
                    neighborList.Remove(neighborList[neighborCounter]);
                }
            }
        }

如果你们需要更多背景信息,请告诉我。错误显示在声明 tile1 的行上。看起来我正在尝试访问邻居列表不包含的元素。

收到“ArgumentOutOfRangeException”错误,但不知道如何

你的neighborCounter是一个外循环。如果你从neighborList中移除足够多的东西,因为neighborCountertoBeCheckedCounter移动时没有移动,所以可能会有一个点 neighborCounter = neighborList.Count ,这将触发您的ArgumentOutOfRangeException

我建议你避免在循环或foreach中删除。您可以列出要删除的所有项目,然后进行,即

if(tile1 == tile2)
{
  itemsToRemove.Add(neighborList[neighborCounter]); // itemsToRemove can be a HashSet
}

Tyress的解释是正确的:https://stackoverflow.com/a/35546304/4927547

避免获得ArgumentOutOfRangeException的另一种方法是像这样重写代码:

foreach (Vector2 neighbor in neighborList)
{
    foreach (Vector2 toBeCheckedItem in toBeChecked)
    {
        if (neighbor == toBeCheckedItem)
        {
            neighborList.Remove(neighbor);
        }
    }
}

另一种方式

foreach (Vector2 toBeCheckedItem in toBeChecked)
{
    if (neighborList.Contains(toBeCheckedItem))
    {
        neighborList.Remove(toBeCheckedItem);
    }
}