导航
  • 主页
  • C#综合技术
  • C#互联网桌面应用
  • AppLauncher
  • WinForm
  • WPF
  • 问答

.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 又是什么意思?还有其他什么是这类的知识?
...全文
221 点赞 收藏 7
写回复
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 移动到下一个对象的位置 因为越界了 所以下一个对象内存没给你分配 所以你不能动 就报错了
回复
发动态
发帖子
C#
创建于2007-09-28

10.4w+

社区成员

.NET技术 C#
申请成为版主
社区公告

全世界最好的语言,没有之一.