2014-01-10 4 views
4

닷넷 응용 프로그램 충돌 :Stackstace에서 MoveNext의 접두사는 무엇을 의미합니까? 스택 추적과

호출 스택 :

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 코드이며 문제가되지 않습니다.

다음은 첫 번째 호출이 의미하는 무엇 :이 방법 MoveNext() 실패 SizeAndPositionControlViewModel의 인스턴스의 비동기 방식 OnLayoutSelectionChanged()에서 . MoveNext()은 LINQ 메서드 메서드 Any에서 Microsoft 코드가됩니다.

d__5는 무엇을 의미합니까?

+0

Linq는 결과를 평가하는 임시'IEnumerable' 클래스를 만듭니다. 'd__5.MoveNext'는 생성 된 IEnumerable에 대한 반복입니다. – juharr

답변

6

부분은 생성 된 다른 멤버/형식에서 고유 한 구문을 유지하기 위해 C# 컴파일러에서 생성 된 접두사입니다. 이 경우 접두어 d은 iterator 또는 async 메서드 생성 클래스임을 의미합니다 (d이 둘 다 사용됩니다). 숫자는 생성 된 모든 이름에 대해 단지 증가됩니다.

0

이들은 컴파일러에 의해 자동 생성 된 곳 (심지어 익명 메소드는 디버깅 할 때 유사하게 보일 수 있습니다)의 람다 식 이름입니다.

0

반환하는 IEnumerable 개체를 만드는 새로운 방법 중 몇 가지는 "익명"클래스를 정의하고 인스턴스화하여 컴파일러에서 구현됩니다. 클래스는 실제로 이름이 필요하므로 컴파일러는 사용자가 보는 것처럼 생성합니다. 예 : this article 뒤에 무엇이 일어나고 있는지.

관련 문제