Foreach循环不会前进也不会抛出异常

时间:2016-05-28 09:34:27

标签: c# loops unity3d foreach

为简单起见;想象一下班级汽车的循环;每辆车都包含一系列汽车系统;第二个循环通过每个系统从汽车中删除它们。理想情况下,最后,每辆车都没有系统。

这是简化代码。

public class ParseCars: MonoBehaviour 
{
    foreach (cars a_car in cars_list)
    {
        // retrieve the systems for the current car
        List<car_system> systems_list = a_car.ReturnSystemList();

        foreach (car_system a_system in systems_list)
        {
            a_car.RemoveSystem(a_system);
        }
        Debug.Log("removed all systems for this car);
    }
}

删除系统时,我所做的就是调用汽车类中包含的列表的Remove方法。

第一次删除成功;然后,当是时候删除下一个元素,而不是再次执行删除调用时,它会返回上一个foreach,在列表中加载下一个汽车。

查看下一个系统的名称;我仍然看到前一个,就好像循环不会占用列表中的下一个项目。 我没有看到任何异常,这是我第一次看到这种行为,并且无法真正弄清楚发生了什么,因为我从调试器中得不到反馈。

1 个答案:

答案 0 :(得分:3)

您应该使用for循环。在foreach中,您无法在循环下更改集合。

AFAIK,foreach使用枚举器,foreach中的迭代变量是只读的。枚举器返回对象的COPY ...这就是为什么你没有得到异常。您实际上编辑了对象的副本而不是对象本身。