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

数组初始化疑问:为何重新赋值未触发索引越界错误?

问题解答

你的认知没错:数组确实是固定长度的,一旦创建就无法修改其长度,越界访问数组索引会触发"Index was outside the bounds of the array"错误。但你写的代码根本没在修改原数组,而是在给变量重新赋值新数组,这就是代码能正常运行的原因。

拆解代码逻辑

看你的这段代码:

private static int[] return_Array()
{
   int[] arr = new int[5];

   arr = [1,2,3,4,5,6];

   return arr;
} 
  1. 第一行int[] arr = new int[5];:创建了一个长度为5的int数组对象,并让变量arr指向这个对象。
  2. 第二行arr = [1,2,3,4,5,6];:这是C# 9及以上版本的数组字面量语法,等价于new int[] {1,2,3,4,5,6}——它会创建一个全新的长度为6的数组对象,然后把变量arr的指向从原来的长度5的数组,改成指向这个新的长度6的数组。原来的长度5的数组因为没有变量引用它,后续会被.NET的垃圾回收机制清理。

同理,arr = new int[] {1,2,3,4,5,6,7};也是一样的逻辑:创建一个长度为7的新数组,让arr指向它,和原来的数组毫无关系。

什么时候才会触发索引越界错误

只有当你试图访问原数组中不存在的索引时才会报错,比如把代码改成这样:

private static int[] return_Array()
{
   int[] arr = new int[5];
   // 原数组索引范围是0-4,访问索引5属于越界
   arr[5] = 6;
   return arr;
} 

这时候运行代码才会触发"Index was outside the bounds of the array"错误。

核心区别

  • 数组对象:一旦创建,长度固定不可变。
  • 数组变量:只是一个引用,它可以指向任何同类型的数组对象,不管那个对象的长度是多少。你代码里的操作都是修改变量的指向,不是修改原数组本身。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.15 21:35:05