什么是“索引超出范围”exception,我该如何解决?

我收到以下错误之一:

  • “索引超出范围,必须是非负的,小于收集的大小”
  • “插入指数超出范围,必须是非负值,小于等于尺寸。”
  • “指数数组的边界之外。”

这是什么意思,我该如何解决?

也可以看看
IndexOutOfRangeException
ArgumentOutOfRangeException

为什么会发生这种错误?

因为您尝试使用超出集合边界的数字索引来访问集合中的元素。

集合中的第一个元素通常位于索引0 。 最后一个元素位于索引n-1 ,其中n是集合的Size (它包含的元素的数量)。 如果您尝试使用负数作为索引,或者使用大于Size-1的数字,则会出现错误。

索引数组是如何工作的

当你像这样声明一个数组:

 var array = new int[6] 

数组中的第一个和最后一个元素是

 var firstElement = array[0]; var lastElement = array[5]; 

所以当你写:

 var element = array[5]; 

您正在检索数组中的第六个元素,而不是第五个元素。

通常,你可以像这样循环一个数组:

 for (int index = 0; index < array.Length; index++) { Console.WriteLine(array[index]); } 

这是有效的,因为循环从零开始,并且以Length-1结束,因为index不再小于Length

但是,这会引发一个例外:

 for (int index = 0; index <= array.Length; index++) { Console.WriteLine(array[index]); } 

注意<=在那里? 现在index在最后一个循环迭代中会超出范围,因为循环认为Length是一个有效的索引,但事实并非如此。

其他collections如何工作

列表以相同的方式工作,除了通常使用Count而不是Length 。 他们仍然从零开始,并以Count - 1结束。

 for (int index = 0; i < list.Count; index++) { Console.WriteLine(list[index]); } 

但是,您也可以使用foreach遍历列表,避免整个索引的问题:

 foreach (var element in list) { Console.WriteLine(element.ToString()); } 

你不能索引还没有添加到集合的元素。

 var list = new List<string>(); list.Add("Zero"); list.Add("One"); list.Add("Two"); Console.WriteLine(list[3]); // Throws exception.