在堆栈跟踪中,MoveNext的前缀是什么意思?

20

.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) 

调用堆栈的其余部分是 Windows 代码,不重要。

以下是第一个调用的含义: 在SizeAndPositionControlViewModel实例中的异步方法OnLayoutSelectionChanged()中,它在MoveNext()方法中失败了。MoveNext()恰好是 Microsoft 在 LINQ 方法Any中的代码。

d__5代表什么?


Linq 创建临时的 IEnumerable 类来评估结果。d__5.MoveNext 是对其创建的 IEnumerable 进行迭代。 - juharr
3个回答

21

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


0

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


0

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


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接