访问记录类型上的 property/field 会产生 IndexOutOfRangeException

Accessing a property/field on record type yields an IndexOutOfRangeException

我正在 Visual Studio 2017 Community Edition Windows 7.

中开发 .Net 5.0 控制台应用程序

评估此 C# 代码时: int weirdIndex = child.Depth - 1; 或类似地 int weirdIndex = child._depth - 1; 抛出 IndexOutOfRangeException。

child 是记录类型 Step,它有一个私有字段 _depth 以及一个 public getter Depth。以下是该记录的摘录:

record Step
{
    /* a bunch of logic */

    private readonly int _depth;
    public int Depth => _depth;
}

我尝试使用 struct 而不是 record 类型,但它没有解决问题。

weirdIndex 稍后用于访问数组,但边界非常好。这是使用 weirdIndex 的函数的摘录:

foreach (var child in AllFather.Children)
    levels[child.Depth - 1][levelPtrs[child.Depth - 1]] = child.Sum.ToString();
    int weirdIndex = child._depth - 1;
    Console.WriteLine("Just separating the lines");
    levelPtrs[weirdIndex] = levelPtrs[weirdIndex] + 1;
}

这是情况的屏幕截图:

我想指出消息 Just separating the lines 实际上在抛出异常之前在控制台中出现了两次。

我尝试在 Debug Window 的 Watch 1 中评估以下表达式,并且所有内容都有预期值:

Expression                 | Value
----------------------------------
levelPtrs[0]               | 2
child.Depth - 1            | 0
levelPtrs[child.Depth - 1] | 2

我快速阅读了 IndexOutOfRangeException Class reference by Microsoft, and then also found this thread on Whosebug: What is an IndexOutOfRangeException / ArgumentOutOfRangeException and how do I fix it?,但据我所知,它们似乎都没有解决我遇到的问题。

我很困惑,非常感谢您的帮助。我错过了什么?这是某种错误吗?

编辑:levelsstring[][] 类型,levelPtrsint[] 类型,AllFather.ChildrenStep[] 类型。

编辑:我将所有代码放在分支“indexoutofrangeexception”下的 public GitLab 存储库中,以防有人想查看整个代码库。它不大,但很吵。这是回购协议:https://gitlab.com/wizardsanimals/funny-problems .

正如@jalepi 在评论中指出的那样,levels[0] 确实是一个没有索引 2 的数组,因为它的长度只有 2。这就是抛出异常的原因。

虽然在第 39 行,而不是第 41 行。我不知道为什么 Visual Studio 认为“int weirdIndex = ...”行是问题所在,我认为它不应该这样做。也许它正在尝试提供帮助。

感谢大家的评论。这个故事的寓意:当异常原因不清楚时,检查下面和上面的代码。