C# 为什么;指数超出范围”;列表的例外情况<;T>;但不适用于阵列?

C# 为什么;指数超出范围”;列表的例外情况<;T>;但不适用于阵列?,c#,arrays,list,indexoutofrangeexception,C#,Arrays,List,Indexoutofrangeexception,当我初始化数组并使用索引器访问元素时,效果很好: object[] temp = new object[5]; temp[0] = "bar"; 现在,如果您可以通过将容量传递给构造函数对其进行初始化,我希望对列表也能使用相同的方法: List<object> temp = new List<object>(5); temp[0] = "bar"; List temp=新列表(5); 温度[0]=“巴”; 但是,最后一行引发以下异常: 索引超出范围。必须为非负数且小

当我初始化数组并使用索引器访问元素时,效果很好:

object[] temp = new object[5];
temp[0] = "bar";
现在,如果您可以通过将容量传递给构造函数对其进行初始化,我希望对
列表
也能使用相同的方法:

List<object> temp = new List<object>(5);
temp[0] = "bar";
List temp=新列表(5);
温度[0]=“巴”;
但是,最后一行引发以下异常:

索引超出范围。必须为非负数且小于集合的大小

为什么
列表
类型会发生这种情况,而数组却不会?既然数组只是CLR集合的低级抽象,那么为什么会出现这种异常呢



原文作者。

简短回答:,因为这5个词的作用截然不同

长答案:

初始化数组时,设置其大小,并且该大小是固定的。阵列以后无法增长或收缩。所以,

object[] temp = new object[5];
意味着创建一个包含5个元素的新数组。因此,您可以在创建阵列后立即访问这些元素

对于列表,大小是可变的。的实例在内部使用一个数组来存储其项,当您在列表中添加或删除项时,该数组将被一个更大或更小的数组替换。在这些情况下,列表中保留的所有项都会从上一个数组复制到新数组中。由于这是一个非常昂贵的操作,内部阵列会有一些未使用项的开销。只要将项添加到列表中,并且不超过该内部数组的大小,就不需要替换该数组

传递给列表构造函数的5是该内部数组的初始大小:

List<object> temp = new List<object>(5);
List temp=新列表(5);

这意味着,您创建的列表有0个元素(因此是例外),但内部数组的大小初始化为5,因此您可以添加5个元素,而无需替换内部数组。

@SririamSakthivel:谢谢您的编辑。然而,我真的认为替换比调整大小更有意义。答案的关键是数组不会调整大小,但列表中有一个内部数组会被一个新的、更大或更小的数组实例替换。也许你应该提到,要修复他的列表代码,他应该将行从
temp[i]=criteria[i+1].ToString()改为
temp[i]=criteria[i+1]
临时添加(标准[i+1].ToString())你可以找到关于这个问题的所有元讨论。@RobertHarvey:谢谢你-尽管如此,我还是补充了一条关于原作者的简短评论,因为我不想看起来像一个抄袭者,抄袭别人的问题而不给予表扬。