You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

C# foreach循环内用MyArray[i]输出数组结果异常问题

C# foreach遍历int数组输出错位且不报错的原理

核心认知偏差

混淆了for循环和foreach循环的循环变量含义:

  • 用for循环按索引遍历数组时,循环变量存的是0到数组长度-1的索引值,需要通过数组[索引]的方式取元素
  • 用foreach遍历集合/数组时,循环变量存的直接是当前遍历到的元素本身,不是索引

输出结果匹配逻辑

测试数组定义为int[] MyArray = { 1, 2, 3, 4, 5, 6, 7, 8, 9, 0 },数组长度为10,合法索引范围是0~9。
错误写法中,每一轮循环的执行逻辑如下:

  • 第1轮:遍历到元素值1,执行MyArray[1],取索引1位置的元素2 → 输出2
  • 第2轮:遍历到元素值2,执行MyArray[2],取索引2位置的元素3 → 输出3
  • 第3到第9轮:遍历到的元素值依次为39,对应取索引39位置的元素,依次输出4、5、6、7、8、9、0
  • 第10轮:遍历到元素值0,执行MyArray[0],取索引0位置的元素1 → 输出1
    最终输出序列恰好是2 3 4 5 6 7 8 9 0 1,和实际运行观测结果完全一致。

未触发异常的原因

本次错误写法没有抛出运行时异常属于纯粹的巧合:数组中存储的所有元素值刚好都落在0~9的合法索引区间内,每次调用MyArray[i]都访问到了数组的合法内存位置,自然不会触发IndexOutOfRangeException(索引越界异常)。
如果数组中存在小于0、或者大于等于10的元素值,这个错误写法会立刻抛出越界异常,不会静默运行。

错误写法复现

int[] MyArray = { 1, 2, 3, 4, 5, 6, 7, 8, 9, 0 };

foreach (int i in MyArray)
{
    Console.WriteLine(MyArray[i]);
}

正确遍历写法

foreach循环不需要通过索引二次取值,直接输出循环变量即可:

int[] MyArray = { 1, 2, 3, 4, 5, 6, 7, 8, 9, 0 };

foreach (var num in MyArray)
{
    Console.WriteLine(num);
}

内容的提问来源于stack exchange,提问作者Moarbidcan

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.27 04:48:34