访问记录类型上的 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?,但据我所知,它们似乎都没有解决我遇到的问题。
我很困惑,非常感谢您的帮助。我错过了什么?这是某种错误吗?
编辑:levels
是 string[][]
类型,levelPtrs
是 int[]
类型,AllFather.Children
是 Step[]
类型。
编辑:我将所有代码放在分支“indexoutofrangeexception”下的 public GitLab 存储库中,以防有人想查看整个代码库。它不大,但很吵。这是回购协议:https://gitlab.com/wizardsanimals/funny-problems .
正如@jalepi 在评论中指出的那样,levels[0] 确实是一个没有索引 2 的数组,因为它的长度只有 2。这就是抛出异常的原因。
虽然在第 39 行,而不是第 41 行。我不知道为什么 Visual Studio 认为“int weirdIndex = ...
”行是问题所在,我认为它不应该这样做。也许它正在尝试提供帮助。
感谢大家的评论。这个故事的寓意:当异常原因不清楚时,检查下面和上面的代码。
我正在 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?,但据我所知,它们似乎都没有解决我遇到的问题。
我很困惑,非常感谢您的帮助。我错过了什么?这是某种错误吗?
编辑:levels
是 string[][]
类型,levelPtrs
是 int[]
类型,AllFather.Children
是 Step[]
类型。
编辑:我将所有代码放在分支“indexoutofrangeexception”下的 public GitLab 存储库中,以防有人想查看整个代码库。它不大,但很吵。这是回购协议:https://gitlab.com/wizardsanimals/funny-problems .
正如@jalepi 在评论中指出的那样,levels[0] 确实是一个没有索引 2 的数组,因为它的长度只有 2。这就是抛出异常的原因。
虽然在第 39 行,而不是第 41 行。我不知道为什么 Visual Studio 认为“int weirdIndex = ...
”行是问题所在,我认为它不应该这样做。也许它正在尝试提供帮助。
感谢大家的评论。这个故事的寓意:当异常原因不清楚时,检查下面和上面的代码。