无法使用 [] 将索引应用于“对象”类型的表达式

Posted

技术标签:

【中文标题】无法使用 [] 将索引应用于“对象”类型的表达式【英文标题】:Cannot apply indexing with [] to an expression of type `object' 【发布时间】:2012-12-09 21:04:22 【问题描述】:

H这是我的代码:返回浮点数的 ArrayList 的 ArrayList:

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:无法将带有 [] 的索引应用于类型表达式 `对象'

我已经做了选角,有什么问题吗? :(

【问题讨论】:

编译器是否提供关于错误可能在哪里的提示? 我看不到您的代码将索引应用于对象类型表达式的位置。我们有线索吗? 使用类并将它们添加到强类型List&lt;YourClass&gt; 是的,它提供了提示,抱歉:所有这些行:" 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]; " 【参考方案1】:

问题在于paredes[i] 返回一个object,它是ArrayList 索引器的返回类型。您需要将其转换为 ArrayList 才能访问它:

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

但更好的解决方案是使用泛型并填充 List&lt;float&gt;

List<float> RetornaEmList(float a,float b,float c, float d, float e)

    return new List<float>  a, b, c, d, e ;

那么paredesList&lt;List&lt;float&gt;&gt; 并且您的访问器可以更改为:

float a = paredes[i][0];

【讨论】:

非常感谢。我正在使用 foreach (var row in dt.Rows) 遍历数据表中的行,但它没有识别典型的行 [“ID”]。一旦我将 var 更改为 DataRow 一切正常。【参考方案2】:

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

您将ArrayListfloat 存储在外部ArrayList 中。由于您总是存储浮点数,因此最好将List&lt;float&gt; 用于内部列表,将List&lt;List&lt;float&gt;&gt; 用于外部列表。这样您就不必从 object 输入 cast:

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&lt;float&gt;

如果您只想让代码工作而不从 ArrayList 移动到 List,则需要额外的演员表:

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

但改用List&lt;float&gt; 会更简洁。

【讨论】:

【参考方案3】:

你在哪里做演员?

我会说它必须是(没有尝试使用编译器):

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

您是否考虑过使用泛型集合?

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

【讨论】:

【参考方案4】:

代码应该是这样的:

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

【讨论】:

我相信这会导致同样的错误,因为itemobject @svick,item 是一个列表,item[0] 是一个浮动元素。 是的,但编译器不知道这一点,这就是为什么原始代码会导致错误,而您的代码没有解决这个问题。 正如 svick 指出的那样,这不会编译,因为item 将被输入为object。如果您将var 替换为ArrayList,则应该这样做。

以上是关于无法使用 [] 将索引应用于“对象”类型的表达式的主要内容,如果未能解决你的问题,请参考以下文章

无法将带有 [] 的索引应用于“type”类型的表达式

无法将带有 [] 的索引应用于“System.Collections.Generic.IEnumerable<> 类型的表达式

如何将 [] 索引应用于“ISession”类型的表达式?

C# - T 类型、数组、列表索引

MySQL (InnoDB)在什么情况下无法使用索引

Typescript 从具有泛型类型的对象索引调用函数