Я нашел такой художественный в сетевом форуме Reflector, может помочь всем понять эту проблему, и надеюсь, что следующая версия .net Reflector может решить эту проблему:
Автор: odalet PostPosted: четверг, 23, 2008 9:12 вечера Сообщение является ответом на вопрос - верните новый GetEnumerator> d__0 (0) {<> 4__this = this}
Фактически, из .NET 2.0 некоторые языковые конструкции являются просто синтаксическим сахаром и приводят к генерации IL при компиляции. Эти конструкции включают в себя оператор yield среди прочих (анонимные делегаты и лямбды, анонимные типы, linq, ...)
Я думаю, что код, который вы видели, является сгенерированным кодом для выхода. Каждый раз, когда вы создаете быструю реализацию IEnumerable, записывая возвращение yield ..., за сценой (во время компиляции) создается полный класс перечислителя. Поскольку он генерируется непосредственно в IL (ну, я так полагаю), имена переменных и методов не должны соответствовать ограничениям именования C #.
Начиная этот пост, я сказал, что это может быть «отсутствующая» функциональность. Было бы замечательно, если бы мы могли включить опцию, запрашивающую Reflector, проверять правильность операторов на C #, а если нет, генерировать имена, совместимые с C # (или VB) (не должно быть слишком сложно: обычно эти переменные и методы) являются частными или внутренними, и любой обфускатор знает, как это сделать ...).
В той же области могут возникнуть некоторые проблемы с не ключевыми словами или конструкциями C #. Обычно операторы switch не компилируются обратно правильно (потому что если некоторые goto прыгают слишком далеко для компилятора C #. И мы можем найти некоторые странные блоки в try / catch / finally: может появиться блок ошибок ... Это действительно в IL , но не в C #