C#自定义索引器为List赋值时报索引超出范围异常如何解决
问题根源
触发索引越界的核心原因有两个:
- C#中
List<T>(int capacity)构造函数的入参是初始容量,不是初始元素数量。执行new List<Flight>(100)后,flights集合的Count属性仍然为0,没有任何元素,此时直接通过[下标]给不存在的位置赋值,必然触发越界异常。 - 你在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
相关产品推荐
相关产品推荐

