c# - 什么是 "index out of range"异常,如何修复它?

标签 c# .net indexoutofrangeexception

我遇到以下错误之一:

  • “索引超出范围。必须为非负值且小于集合的大小”
  • “插入索引超出范围。必须为非负值且小于或等于大小。”
  • “索引超出了数组的范围。”

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

另请参阅
IndexOutOfRangeException
ArgumentOutOfRangeException

最佳答案

为什么会出现这个错误?

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

集合中的第一个元素通常位于索引 0 。最后一个元素位于索引 n-1 处,其中nSize集合的数量(它包含的元素数量)。如果您尝试使用负数作为索引,或者大于 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/57828414/

相关文章:

c# - 从 C# 中的 WebBrowser 控件打印时设置页面方向。 (非 WPF 应用程序)

c# - GetType() 和 GetTypes() 等反射 API 的性能如何?

ios - Swift 4 中无法使用 'Self' 类型的索引为 'Int' 类型的值添加下标吗?

.net - ArgumentOutOfRangeException 和 IndexOutOfRangeException 的性能

c# - 是否可以在 WPF 的单独进程中隔离某些控件?

swift - fatal error : Array index out of range with many tap Swift

c# - AutoResetEvent/ManualResetEvent 消耗什么资源?

c# - 如何使用 C# 启用/禁用计划任务?

c# - 匿名管道是去这里的正确方法吗?

c# - 为什么 linq to object 手动实现迭代器?