Что означает трассировка стека, включая Namespace.ClassName. <MethodName>b__f? - PullRequest
2 голосов
/ 09 февраля 2012

У меня есть журнал ошибок пользователя с трассировкой стека, который я не до конца понимаю.Вот как это выглядит

Stack Trace:
   at ...Presenters.Forms.PresenterHome.<GetCounts>b__f(IActivityItem activityItem)
   at System.Linq.Enumerable.Count[TSource](IEnumerable`1 source, Func`2 predicate)
   at ...Presenters.Forms.PresenterHome.GetCounts(Int32& completeCount, Int32& incompleteCount)
   at ...Presenters.Forms.PresenterHome.UpdateSummaryPanel()
   .....

(я удалил начало некоторых пространств имен для защиты личности клиента)

Часть, которую я не понимаю, <GetCounts>b__f(...) и почему она вызываетсяEnumerable.Count[...](...).Я предполагаю, что это как-то связано с предикатом Count, но я не могу полностью расшифровать это.

Если это помогает, исключение составляет InvalidCastException.Вот часть кода (слегка модифицированного для защиты личности).

void UpdateSummaryPanel()
{
    int completeCount;
    int incompleteCount;
    GetCounts(out completeCount, out incompleteCount);
    ...
}

private void GetCounts(
    out int completeCount, 
    out int incompleteCount)
{
    incompleteCount = _applicationContext.ActivityItems.Count(
        activityItem => activityItem.ActivityType == ActivityTypes.Foo
                        && ((FooActivity) activityItem).Status != CaptureStatus.Bar);

    // similar code for other count
}

Я уверен, что знаю, что является причиной ошибки (то есть, где плохой актерский состав), но что ямне действительно любопытно, что <GetCounts>b__f(...) член в трассировке стека.

Ответы [ 2 ]

4 голосов
/ 09 февраля 2012

Если вы откроете свою сборку с помощью Reflector, dotPeek и т. Д., Вы увидите, что компилятор поместил логику для вашего лямбда-выражения внутри GetCounts в другой метод - в данном случае <GetCounts>b__f. Это совершенно нормально для лямбда-выражений и анонимных методов - и некоторые другие функции C # (блоки итераторов, анонимные типы, автоматически реализуемые методы и т. Д.) Также автоматически создают элементы для вас.

Угловые скобки в имени являются хорошим показателем того, что оно генерируется компилятором: компилятор использует невыразимое имя - имя, которое не является допустимым идентификатором - чтобы убедиться, что оно не только будет не будет никаких столкновений с другими вашими участниками, но вы также никогда не сможете ссылаться на этих «скрытых» членов в своем коде.

1 голос
/ 09 февраля 2012

Это означает, что он находится внутри чего-то, что сгенерировал компилятор, в данном случае это анонимный делегат.В частности, компилятор генерирует метод с именем <GetCounts>b__f для вашего типа.

...