为什么要这样休息?解决似乎什么都没改变的问题?

kej*_*ion 0 c# unity-game-engine

我正在尝试为游戏的设备经理编写代码。

这是代码:

public class EquipmentManager : MonoBehaviour
{
    public int slots;
    public List<Equipment> defaultEquipment;
    public List<Equipment> currentEquipment;

    private void Start()
    {
        slots = System.Enum.GetNames(typeof(EquipmentSlot)).Length;

        EquipDefault();
    }

    public void Equip(Equipment newEquipment)
    {
        foreach (Equipment oldEquipment in currentEquipment)
        {
            if (oldEquipment.slot == newEquipment.slot)
            {
                Unequip(oldEquipment);
                break;
            }
        }

        currentEquipment.Add(newEquipment);
        gameObject.GetComponent<AvatarManager>().RenderPrefab(newEquipment.prefabName, true);
    }

    public void Unequip(Equipment oldEquipment)
    {
        currentEquipment.Remove(oldEquipment);
        gameObject.GetComponent<AvatarManager>().RenderPrefab(oldEquipment.prefabName, false);
    }

    public void EquipDefault()
    {
        foreach (Equipment equipment in defaultEquipment)
        {
            Equip(equipment);
        }
    }
}
Run Code Online (Sandbox Code Playgroud)

如果我break;从循环if内部删除,foreach则不会添加新设备,currentEquipment并且还会收到此错误:

InvalidOperationException:集合已被修改;枚举操作可能无法执行。

为什么????对我来说完全是无稽之谈。

小智 6

使用foreach循环对其进行迭代时,无法修改集合。使用该break语句,在使用修改循环之后,循环将永远不会到达下一个迭代UnEquip(),因此不会出错。

要具有相同的功能,可以使用常规for循环遍历集合,然后使用将该集合currentEquipment.RemoveAt(i)从列表中删除。