为什么我的IList只读?

时间:2014-01-31 02:48:57

标签: c# list unity3d ilist

我正在制作游戏。我搜索对象中的所有子组件并从中创建一个列表,然后删除第一个条目,因为我不想要它。我尝试删除第一个条目时发生错误。谷歌似乎没有关于此事的任何内容,一切都是如何让它成为只读。

我收到此错误:

NotSupportedException: Collection is read-only
System.Array.InternalArray__RemoveAt (Int32 index) (at /Users/builduser/buildslave/monoAndRuntimeClassLibs/build/mcs/class/corlib/System/Array.cs:147)
(wrapper managed-to-managed) UnityEngine.Transform[]:System.Collections.Generic.IList`1.RemoveAt (int)
PlayerEquipper.Start () (at Assets/PlayerEquipper.cs:27)

这是我的代码:

private IList<Transform> characterChilds = new List<Transform>();
private IList<Transform> armorChilds = new List<Transform>();
private IList<Transform> glovesChilds = new List<Transform>();
private IList<Transform> bootsChilds = new List<Transform>();



void Start()
{
    characterChilds = new List<Transform>();
    characterChilds = transform.GetComponentsInChildren<Transform>();
    Debug.Log(characterChilds[0]);
    characterChilds.RemoveAt(0);
    Debug.Log(characterChilds[0]);
}

2 个答案:

答案 0 :(得分:2)

似乎GetComponentsInChildren方法返回一个不可变的集合。您可以尝试以下方法来解决它:

characterChilds = transform.GetComponentsInChildren<Transform>().ToList();

答案 1 :(得分:1)

你的这一行:

characterChilds = new List<Transform>();

创建一个可变列表。但是,以下行:

characterChilds = transform.GetComponentsInChildren<Transform>();

覆盖该列表,因此上一行无用。显然,GetComponentsInChildren会返回不可修改的IList。如果你真的想从该方法调用的结果开始并仍然能够修改列表,你可以尝试:

characterChilds = new List<Transform>(transform.GetComponentsInChildren<Transform>());

现在,您可以从该列表中删除项目,但如果没有更多上下文,我不确定它是否会完全符合您的希望。