什么是“索引超出范围”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.