收到“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 的行上。看起来我正在尝试访问邻居列表不包含的元素。
你的neighborCounter
是一个外循环。如果你从neighborList
中移除足够多的东西,因为neighborCounter
在toBeCheckedCounter
移动时没有移动,所以可能会有一个点 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);
}
}