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

C#自定义索引器为List赋值时报索引超出范围异常如何解决

问题根源

触发索引越界的核心原因有两个:

  1. C#中List<T>(int capacity)构造函数的入参是初始容量,不是初始元素数量。执行new List<Flight>(100)后,flights集合的Count属性仍然为0,没有任何元素,此时直接通过[下标]给不存在的位置赋值,必然触发越界异常。
  2. 你在AirlineCompany类中自定义了索引器,但Main方法里完全没有用到,直接操作了公开的flights字段,没有走自定义的索引器逻辑。

修复方案

方案1:使用自定义索引器赋值

首先修正AirlineCompany索引器的不合理逻辑:原set方法用Insert会导致每次赋值都插入新元素,下标对应逻辑和普通集合不符,改成直接替换对应位置的元素更符合常规使用习惯:

class AirlineCompany
{
    public static readonly string airlineName;
    static AirlineCompany()
    {
        airlineName = "Vietjet airline";
    }
    // 将flights改为私有,避免外部直接操作破坏封装
    private List<Flight> flights= new List<Flight>(100);
    public Flight this[int index]
    {
        set
        {
            // 下标在现有元素范围内则直接替换
            if (index < flights.Count)
            {
                flights[index] = value;
            }
            // 下标刚好等于当前元素总数则追加
            else if (index == flights.Count)
            {
                flights.Add(value);
            }
            else
            {
                // 下标超出范围可按需选择抛异常或自动填充空元素
                throw new ArgumentOutOfRangeException(nameof(index), "下标超出集合可用范围");
            }
        }
        get
        {
            return flights[index];
        }
    }
    // 可按需添加公开属性获取航班总数
    public int FlightCount => flights.Count;
}

Main方法改为调用自定义索引器赋值:

static void Main(string[] args)
{
    AirlineCompany vn = new AirlineCompany();
    Console.WriteLine(AirlineCompany.airlineName);
    // 调用自定义索引器赋值,不要直接操作flights字段
    vn[0] = new Flight(1,"Viet Nam","Finland","24/11",169.9);
    vn[1] = new Flight(2, "Finland", "Singapore", "25/11", 109.9);
    vn[2] = new Flight(3, "Singapore", "Finland", "26/11", 129.9);
    vn[3] = new Flight(4, "Holland", "Germany", "27/11", 69.9);
    Console.ReadLine();
}

方案2:不改动索引器,直接修正List操作逻辑

如果不需要使用自定义索引器,把直接赋值的逻辑改为调用Add方法即可:

static void Main(string[] args)
{
    AirlineCompany vn = new AirlineCompany();
    Console.WriteLine(AirlineCompany.airlineName);
    vn.flights.Add(new Flight(1,"Viet Nam","Finland","24/11",169.9));
    vn.flights.Add(new Flight(2, "Finland", "Singapore", "25/11", 109.9));
    vn.flights.Add(new Flight(3, "Singapore", "Finland", "26/11", 129.9));
    vn.flights.Add(new Flight(4, "Holland", "Germany", "27/11", 69.9));
    Console.ReadLine();
}

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.09.26 07:06:03