.NET 报错堆栈怎么解析?

独立观察员 2019-05-07 04:23:39

Exception.Message:System.ArgumentOutOfRangeException: 索引超出范围。必须为非负值并小于集合大小。
参数名: index
在 System.ThrowHelper.ThrowArgumentOutOfRangeException(ExceptionArgument argument, ExceptionResource resource)
在 System.Collections.Generic.List`1.get_Item(Int32 index)
在 XiRuan.<Checkin>d__65.MoveNext()


比如上面这段报错堆栈信息中,明显的信息是可以看出来,但还是有些地方不太明白,网上也搜不到。
主要是三行“在”:
比如第二行,List`1 指的是 List<T>,1表示一个泛型参数;get_Item 指 Item 属性的 get 方法;
第三行中,显示了在我程序中的出错位置,其中 Checkin 是个方法。

那么问题就来了,d__65 是什么意思?MoveNext 又是什么意思?还有其他什么是这类的知识?
...全文
377 7 打赏 收藏 转发到动态 举报
写回复
用AI写文章
7 条回复
切换为时间正序
请发表友善的回复…
发表回复
lihualiu81 2019-05-07
  • 打赏
  • 举报
回复
.net中其实是有很多语法糖的
就拿你这个例子
一个foreach遍历语句
其实是调用了IEnumerable<>的一些方法,比如GetEnumerator
这个会返回一个遍历器IEnumerator<T>
MoveNext就是IEnumerator<T>的往后遍历的方法
exception92 2019-05-07
  • 打赏
  • 举报
回复
索引超出范围。必须为非负值并小于集合大小。 -》获取集合中的数据时,给定的index值会传入到get_Item方法中,这步我们看不到,如果index值不合法,就会出现上述错误.
exception92 2019-05-07
  • 打赏
  • 举报
回复
d_65就是JIT编译器生成的中间语言的代码,目测是一个类,这样才能调用MoveNext方法。我们的很多定义的方法最终都会被编译器优化,生成特定的名称,考虑一下为什么会有匿名类的存在,其实不难理解,它最终的名字也是编译器生成的。 建议大概了解一下。net的编译过程,大概就是代码-机器码-cpu指令。
stherix 2019-05-07
  • 打赏
  • 举报
回复
IEnumerable<T>是.net中相当重要的一个类,用途非常广泛 所有的泛型集合类,foreach,linq等等 都和它有关系
正怒月神 2019-05-07
  • 打赏
  • 举报
回复
你的List[0],其实就是List.getItem(0),只是一个语法糖而已。 其实你只要看报错信息,和innerException,以及StackTrace就可以了。 普遍来说,你这个数组下标越界。就是List[i],这个i超出了List的长度元素下标最大值。
stherix 2019-05-07
  • 打赏
  • 举报
回复
.net中其实是有很多语法糖的 就拿你这个例子 一个foreach遍历语句 其实是调用了IEnumerable<>的一些方法,比如GetEnumerator 这个会返回一个遍历器IEnumerator<T> MoveNext就是IEnumerator<T>的往后遍历的方法 <Checkin>d__65其实就是编译器生成的代码,后缀d_65用来防止变量重名
OrdinaryCoder 2019-05-07
  • 打赏
  • 举报
回复
我也没研究过这个,但是我猜d__65可能是随机声明一个名字吧,MoveNext 移动到下一个对象的位置 因为越界了 所以下一个对象内存没给你分配 所以你不能动 就报错了

110,537

社区成员

发帖
与我相关
我的任务
社区描述
.NET技术 C#
社区管理员
  • C#
  • Web++
  • by_封爱
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告

让您成为最强悍的C#开发者

试试用AI创作助手写篇文章吧