c# - 为什么会出现这个中断;当它似乎什么都没有改变时解决我的问题?
问题描述
我正在尝试为游戏编写设备管理器。
这是代码:
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:集合已修改;枚举操作可能无法执行。
为什么????对我来说完全是无稽之谈。
解决方案
在使用循环对其进行迭代时,您无法修改集合foreach
。使用该break
语句,在使用 修改循环后,循环永远不会到达下一次迭代UnEquip()
,因此它不会出错。
要具有相同的功能,您可以使用普通循环遍历集合for
,并使用currentEquipment.RemoveAt(i)
将其从列表中删除。
推荐阅读
- unity3d - 如何从中间点开始 Vector3.Lerp?
- php - 在编辑器上更新 header.php 时,Wordpress 主题崩溃
- angularjs - 不能在 angular.js 中工作 ng-click,为什么我不明白
- php - 手动订单 - 使用前缀更新每个订单项目元标签
- python - 运行烧瓶代码时出现未找到请求的 URL 错误
- elasticsearch - “由于冲突而无法合并:[无法更新 [_source] 的启用设置,无法更新排除 [_source]] 的设置”
- c - 如何在不使用 extern 关键字的情况下访问全局值?
- node.js - 如何在承诺中使用变量?节点JS
- java - 遍历 HashMap 直到找到第一个值?
- blueprism - 在蓝色棱镜中监视 Chrome 浏览器上的元素时出错