不能对object'类型的表达式应用[]索引

本文关键字:应用 表达式 索引 类型 object 不能 | 更新日期: 2023-09-27 17:49:21

H下面是我的代码:

public ArrayList walls=new ArrayList(); 
public void Start()
{
    walls[0] = ReturnInArrayList(279,275,0,0,90);
    walls[1] = ReturnInArrayList(62,275,0,0,0);
    walls[2] = ReturnInArrayList(62,275,62,0,90);
    walls[3] = ReturnInArrayList(217,275,62,-62,0);
    walls[4] = ReturnInArrayList(62,275,279,0,90);
    walls[5] = ReturnInArrayList(41,275,279,0,0);
    walls[6] = ReturnInArrayList(279,275,320,0,9);
    walls[7] = ReturnInArrayList(320,275,0,-279,0); 
    for (int i = 0; i < walls.Length; i++) {
        float a = (float)walls[i][0];
        float b = (float)walls[i][1];
        float c = (float)walls[i][2];
        float d = (float)walls[i][3];
        float e = (float)walls[i][4];
    }
}
ArrayList ReturnInArrayList(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:不能使用[]对类型的表达式应用索引"对象"

我已经选角了,怎么了?(

不能对object'类型的表达式应用[]索引

问题是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];

ArrayList存储对象而不限制这些对象的类型。当您访问存储在ArrayList中的对象时,编译器不知道它们是什么类型,所以它只给您类型object

您将floatArrayList存储在外部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>会简洁很多

你在哪里选角?

我想说它必须是(没有尝试与编译器):

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

是否考虑使用泛型集合?

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

代码应该像这样:

//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];
}