MoveNext的前缀在堆栈中意味着什么?

时间:2014-01-10 19:42:03

标签: c# .net debugging crash windbg

.NET应用程序崩溃堆栈跟踪:

调用堆栈:

Layouts!Layouts.Ribbon.SizeAndPositionControlViewModel+OnLayoutSelectionChanged>d__5.MoveNext() 
mscorlib_ni!System.Runtime.CompilerServices.AsyncMethodBuilderCore.<ThrowAsync>b__0(System.Object)
WindowsBase_ni!System.Windows.Threading.ExceptionWrapper.InternalRealCall(System.Delegate, System.Object, Int32) 

callstack的其余部分是Windows代码并不重要。

这是第一个电话暗示的内容: 在OnLayoutSelectionChanged()实例中的异步方法SizeAndPositionControlViewModel中,方法MoveNext()失败了。 MoveNext()碰巧是LINQ方法方法Any中的Microsoft代码。

d__5表示什么?

3 个答案:

答案 0 :(得分:11)

d__5部分是由C#编译器生成的前缀,用于使构造与其他生成的成员/类型保持唯一。在这种情况下,d前缀表示它是迭代器或async方法生成的类(d用于两者)。对于生成的每个名称,该数字只会递增

答案 1 :(得分:0)

这些是lambda表达式的名称,这些表达式由编译器自动生成(在调试时匿名方法也可能看起来类似)。

答案 2 :(得分:0)

创建返回IEnumerable对象的几种新方法是在编译器中通过定义和实例化“匿名”类来实现的。这些类实际上需要有一个名称,因此编译器会像您看到的那样生成一个。参见例如this article了解幕后发生的事情。