0

我有以下问题,当我尝试从另一个数组列表中的数组访问数据时,它显示“无法将索引 [] 应用于‘对象’类型的表达式”。

这是我的代码

public void getWaypoints() {
ArrayList potentialWPs = new ArrayList();
potentialWPs.Add(containerWaypoint.GetComponentInChildren(typeof(Transform)));
wayPoints = new ArrayList();

foreach (Transform potentialWP in potentialWPs){
    if(potentialWP.transform != containerWaypoint.transform){
        wayPoints[wayPoints.Count] = new ArrayList(2);
        wayPoints[wayPoints.Count][0] = potentialWP;                    
    }
}

错误显示在“ wayPoints[wayPoints.Count][0] ”行中。

任何人都知道为什么会发生此错误?

4

5 回答 5

1

由于 ArrayList 是一个非泛型集合类,因此从中检索到的所有项目都是objects,并且需要强制转换为它们的真实类型,如下所示:

 foreach (Transform potentialWP in potentialWPs){
    if(potentialWP.transform != containerWaypoint.transform){
        wayPoints[wayPoints.Count] = new ArrayList(2);
        ArrayList arr = wayPoints[wayPoint.Count] as ArrayList; <-- THIS
        arr[0] = potentialWP;
    }

需要注意的几个重要事项:

1) 如果您只是简单地创建了新数组并持有对它的引用(arr我介绍的变量),然后使用它添加到 wayPoints 并分配给,这将更加简单。

2) ArrayList 确实是一个古老而原始的类。您是否有理由不使用 aList<Transform>而不是>?

3)您的代码中有一个错误,因为您正在访问位置 Count 中的 ArayList。长度为 2 的 ArrayList,如果在位置 2 访问,将崩溃 - ArrayList 是从 0 开始的,因此您需要使用 Count - 1 来访问长度为 2 的数组上的最后一个位置 (1)。

于 2012-11-27T08:43:06.557 回答
0

试试这个wayPoints[0] = potentialWP; 由于您已经声明了一个带有 size 的数组列表wayPoints.Count,因此您必须正确提及索引。

于 2012-11-27T08:37:40.250 回答
0

您遇到的主要问题是,通过使用ArrayListwhich 只是对象的集合,没有隐式转换为数组。正如其他人回答的那样,一种方法是将结果转换为数组,之后您可以通过索引访问它。

更好的方法可能是使用List<T>可以定义为列表列表的 Generic:

List<List<Transform>> waypoints = new List<List<Transform>>();

这将使您的代码更容易:

public void getWaypoints() {
    ArrayList potentialWPs = new ArrayList();
    potentialWPs.Add(containerWaypoint.GetComponentInChildren(typeof(Transform)));
    List<Transform[]> waypoints = new List<Transform[]>();

    foreach (Transform potentialWP in potentialWPs){
        if(potentialWP.transform != containerWaypoint.transform){
            wayPoints.Add( new List<Transform>>(){ potentialWP });                 
        }
    }
}

waypoints现在是 的列表的“多维”列表Transform。您可以像这样访问任何元素

List<Transform> first = waypoints[0];

或者您可以Transform直接访问

Transform firstOfFirst = waypoints[0][0];

或者您可以将另一个添加Transform到现有列表中

waypoints[0].Add(anotherTransform);
于 2012-11-27T08:44:43.097 回答
0

ArrayList 只保存对象类型;这就是为什么你得到

"cannot apply indexing[] with to an expression of type 'object'"

你需要投

wayPoints

到你想要的类型

编辑:

你应该使用

List<T> (System.Collections.Generics)
于 2012-11-27T08:39:03.613 回答
0
        wayPoints[wayPoints.Count] = new ArrayList(2);
        wayPoints[wayPoints.Count][0] = potentialWP;

wayPoints[wayPoints.Count]返回一个object. 在将其视为 ArrayList 之前,您需要对其进行转换:

((ArrayList)wayPoints[wayPoints.Count])[0] = potentialWP;

但是,您不应该使用 ArrayList,因为它已被弃用。请改用列表。

于 2012-11-27T08:39:47.953 回答