无法使用 [] 将索引应用于“对象”类型的表达式
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<YourClass>
。
是的,它提供了提示,抱歉:所有这些行:" 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<float>
:
List<float> RetornaEmList(float a,float b,float c, float d, float e)
return new List<float> a, b, c, d, e ;
那么paredes
是List<List<float>>
并且您的访问器可以更改为:
float a = paredes[i][0];
【讨论】:
非常感谢。我正在使用 foreach (var row in dt.Rows) 遍历数据表中的行,但它没有识别典型的行 [“ID”]。一旦我将 var 更改为 DataRow 一切正常。【参考方案2】:ArrayList
存储对象而不限制这些对象的类型。当您访问存储在ArrayList
中的对象时,编译器不知道它们是什么类型,所以它只会给您输入object
。
您将ArrayList
或float
存储在外部ArrayList
中。由于您总是存储浮点数,因此最好将List<float>
用于内部列表,将List<List<float>>
用于外部列表。这样您就不必从 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<float>
如果您只想让代码工作而不从 ArrayList
移动到 List
,则需要额外的演员表:
float a = (float)((ArrayList)paredes[i])[0];
但改用List<float>
会更简洁。
【讨论】:
【参考方案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];
【讨论】:
我相信这会导致同样的错误,因为item
是object
。
@svick,item 是一个列表,item[0] 是一个浮动元素。
是的,但编译器不知道这一点,这就是为什么原始代码会导致错误,而您的代码没有解决这个问题。
正如 svick 指出的那样,这不会编译,因为item
将被输入为object
。如果您将var
替换为ArrayList
,则应该这样做。以上是关于无法使用 [] 将索引应用于“对象”类型的表达式的主要内容,如果未能解决你的问题,请参考以下文章
无法将带有 [] 的索引应用于“System.Collections.Generic.IEnumerable<> 类型的表达式