0

次の問題があります。別の配列リスト内の配列からデータにアクセスしようとすると、「indexing[]をタイプ'object'の式に適用できません」と表示されます。

これは私のコードです

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は、実際には古くて原始的なクラスです。List<Transform>代わりに>を使用しない理由はありますか?

3)位置CountでArayListにアクセスしているため、コードにバグがあります。長さ2のArrayListは、位置2でアクセスするとクラッシュします-ArrayListsは0ベースであるため、長さ2の配列の最後の位置(1)にアクセスするには、Count-1を使用する必要があります。

于 2012-11-27T08:43:06.557 に答える
0

あなたが抱えている主な問題は、ArrayListこれをオブジェクトの単なるコレクションとして使用することにより、配列への暗黙の変換がないことです。他の人が答えているように、1つの方法は、結果を配列にキャストし、その後、インデックスでアクセスできるようにすることです。

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

これを試してくださいwayPoints[0] = potentialWP; すでにサイズの配列リストを宣言しているのでwayPoints.Count、インデックスを正しく指定する必要があります。

于 2012-11-27T08:37:40.250 に答える
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 に答える