web-dev-qa-db-ja.com

タイプ[オブジェクト]の式に[]を使用してインデックスを適用することはできません

[〜#〜] h [〜#〜] ereは私のコード:floatを返すArrayListのArrayList:

public ArrayList paredes=new ArrayList();   

public void Start()
{
    paredes[0] = RetornaEmArrayList(279,275,0,0,90);
    paredes[1] = RetornaEmArrayList(62,275,0,0,0);
    paredes[2] = RetornaEmArrayList(62,275,62,0,90);
    paredes[3] = RetornaEmArrayList(217,275,62,-62,0);
    paredes[4] = RetornaEmArrayList(62,275,279,0,90);
    paredes[5] = RetornaEmArrayList(41,275,279,0,0);
    paredes[6] = RetornaEmArrayList(279,275,320,0,9);
    paredes[7] = RetornaEmArrayList(320,275,0,-279,0);  

    for (int i = 0; i < paredes.Length; i++) {
        float a = (float)paredes[i][0];
        float b = (float)paredes[i][1];
        float c = (float)paredes[i][2];
        float d = (float)paredes[i][3];
        float e = (float)paredes[i][4];
    }
}

ArrayList RetornaEmArrayList(float a,float b,float c, float d, float e)
{
    ArrayList arrayList = new ArrayList();
    arrayList.Add(a);
    arrayList.Add(b);
    arrayList.Add(c);
    arrayList.Add(d);
    arrayList.Add(e);
    return arrayList;
}

次のエラーが表示されます。

エラーCS0021:タイプ[オブジェクト]の式に[]を使用したインデックス作成を適用できません

私はすでにキャスティングをしました、何が悪いのですか? :(

11
JamesB

問題はそれです paredes[i]は、objectインデクサーの戻り型であるArrayListを返します。アクセスするには、これをArrayListにキャストする必要があります。

float a= (float)((ArrayList)paredes[i])[0];

ただし、より良い解決策は、ジェネリックスを使用してList<float>代わりに:

List<float> RetornaEmList(float a,float b,float c, float d, float e)
{
    return new List<float> { a, b, c, d, e };
}

paredesList<List<float>>とアクセサは次のように変更できます。

float a = paredes[i][0];
9
Lee

ArrayListは、オブジェクトの種類を制限せずにオブジェクトを格納します。 ArrayListに格納されているオブジェクトにアクセスすると、コンパイラーはオブジェクトのタイプを認識しないため、objectと入力するだけです。

ArrayListfloatを外側のArrayListに保存しています。常にフロートを格納しているので、内部リストにはList<float>を使用し、外部リストにはList<List<float>>を使用することをお勧めします。このようにして、objectから型キャストする必要がなくなります。

using System.Collections.Generic;

public List<List<float>> paredes = new List<List<float>>();   


Start() {
    paredes[0]=RetornaEmList(279,275,0,0,90);
    paredes[1]=RetornaEmList(62,275,0,0,0);
    paredes[2]=RetornaEmList(62,275,62,0,90);
    paredes[3]=RetornaEmList(217,275,62,-62,0);
    paredes[4]=RetornaEmList(62,275,279,0,90);
    paredes[5]=RetornaEmList(41,275,279,0,0);
    paredes[6]=RetornaEmList(279,275,320,0,9);
    paredes[7]=RetornaEmList(320,275,0,-279,0);    



    for (int i=0;i<paredes.Length;i++)
    {           
        float a=paredes[i][0];
        float b=paredes[i][1];
        float c=paredes[i][2];
        float d=paredes[i][3];
        float e=paredes[i][4];                   
    }
}

List<float> RetornaEmList(float a,float b,float c, float d, float e)
{
    return new List<float> { a, b, c, d, e };
}

内部リストには常に5つの浮動小数点数があるため、float[]の代わりにList<float>を使用することもできます。

ArrayListからListに移動せずにコードを機能させたい場合は、追加のキャストが必要です。

float a = (float)((ArrayList)paredes[i])[0];

ただし、代わりにList<float>を使用する方がずっとクリーンです。

2
Scott Chapman

どこでキャストしていますか?

私はそれがそうでなければならない(コンパイラで試さなかった)と言うでしょう:

for (int i = 0; i < paredes.Length; i++)
{           
    float a=(float)((ArrayList)paredes[i])[0];
    ...                   
}

代わりにジェネリックコレクションの使用を検討しましたか?

public List<List<float>> paredes = new List<List<float>>();   
1
CSharper

コードは次のようになります。

//Adding List

paredes.Add(RetornaEmArrayList(279,275,0,0,90));
paredes.Add(RetornaEmArrayList(62,275,0,0,0));
paredes.Add(RetornaEmArrayList(62,275,62,0,90));
paredes.Add(RetornaEmArrayList(217,275,62,-62,0));
paredes.Add(RetornaEmArrayList(62,275,279,0,90));
paredes.Add(RetornaEmArrayList(41,275,279,0,0));
paredes.Add(RetornaEmArrayList(279,275,320,0,9));
paredes.Add(RetornaEmArrayList(320,275,0,-279,0));


//Traversing List

foreach(ArrayList item in paredes)
{
    float a=(float)item[0];
    float b=(float)item[1];
    float c=(float)item[2];
    float d=(float)item[3];
    float e=(float)item[4];
}