This question already has answers here:
What is an IndexOutOfRangeException / ArgumentOutOfRangeException and how do I fix it?
(4个答案)
5年前关闭。
我收到以下错误之一:
“索引超出范围。必须为非负数并且小于集合的大小。” “插入索引超出范围。必须为非负数并且小于或等于大小。” “索引超出了数组的范围。”
这是什么意思,我该如何解决?
另请参见
IndexOutOfRangeException
ArgumentOutOfRangeException
通常,您将遍历如下数组:
但是,这将引发异常:
其他集合如何运作
列表的工作方式相同,除了通常使用
(4个答案)
5年前关闭。
我收到以下错误之一:
这是什么意思,我该如何解决?
另请参见
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
是有效索引,但不是。其他集合如何运作
列表的工作方式相同,除了通常使用
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.
关于c# - 什么是 “index out of range”异常,如何解决? [复制],我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/24812679/