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

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;
}
沿用Delphi访问语法的实现方案

如果你不想改之前的编码习惯,想直接用 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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.10.23 09:15:07