首页 > 解决方案 > 为什么会出现这个中断;当它似乎什么都没有改变时解决我的问题?

问题描述

我正在尝试为游戏编写设备管理器。

这是代码:

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);
        }
    }
}

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

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

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

标签: c#unity3d

解决方案


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

要具有相同的功能,您可以使用普通循环遍历集合for,并使用currentEquipment.RemoveAt(i)将其从列表中删除。


推荐阅读