C#用嵌套List实现二维结构时Map[X,Y]访问报错,Intellisense识别异常
你遇到的索引器报错和Intellisense提示异常,本质都是语法适配问题:C# 中 List<List<PathCoord>> 属于交错结构,本质是“外层List的每个元素是一个独立的List”,这个类型只内置了单参数的索引器,根本没有匹配双参数(X、Y)的索引重载,自然不支持 Map[X, Y] 这种从Delphi二维数组沿用过来的访问语法。
Delphi的原生二维数组是内置双参索引逻辑的,和C#中固定维度二维数组(PathCoord[,])的语法规则一致,但嵌套List是两层独立的单参数结构,两者语法不能直接照搬。因为IDE匹配不到对应的双参索引器,既会抛出重载不存在的报错,也没法推断正确的返回类型,只能弹出基础对象的通用提示。
嵌套List必须拆成两层单参数索引访问,正确写法是 Map[X][Y],而非 Map[X, Y]。
另外你示例代码里存在笔误:未定义的 newPointX 应修正为 newPoint.X。
因为你选择嵌套List的核心目的是实现可动态调整大小的二维存储,直接访问很容易触发索引越界、空引用问题,在读写对应坐标的PathCoord前,必须先确保两层List的长度覆盖目标坐标:
- 先校验外层List的长度是否大于等于目标X坐标,长度不足时逐次补充新的内层List实例
- 再校验X位置对应的内层List长度是否大于等于目标Y坐标,长度不足时逐次补充初始化完成的
PathCoord实例
对应可直接运行的AddPathToPoint方法补全代码:
public void AddPathToPoint(Point newPoint, List<Point> PathTo, double Cost) { // 外层List动态补位,确保覆盖目标X坐标 while (Map.Count <= newPoint.X) { Map.Add(new List<PathCoord>()); } var innerXList = Map[newPoint.X]; // 内层List动态补位,确保覆盖目标Y坐标 while (innerXList.Count <= newPoint.Y) { innerXList.Add(new PathCoord()); } // 读写目标坐标实例 var targetCoord = innerXList[newPoint.Y]; targetCoord.PathTo = PathTo; targetCoord.Cost = Cost; }
如果你不想改之前的编码习惯,想直接用 Map[X, Y] 的双参写法,可以在PathEngine类内部自定义双参数索引器,把两层List的访问逻辑封装起来:
// 将以下代码写入PathEngine类内部 public PathCoord this[int x, int y] { get { // 把之前的动态补位逻辑统一放到这里,避免重复写代码 while (Map.Count <= x) Map.Add(new List<PathCoord>()); var innerList = Map[x]; while (innerList.Count <= y) innerList.Add(new PathCoord()); return innerList[y]; } }
自定义完成后,在PathEngine的实例上就可以直接用[x, y]双参语法访问,不会再触发之前的索引器不匹配报错。
内容的提问来源于stack exchange,提问作者Xander Blackstar

