Компилятор C# реорганизует и переписывает ваш код, чтобы добавить возможности, отсутствующие в .NET.
• Для реализации лямбда-функций компилятор перемещает их код в новый метод, а общие данные — в новый класс.
• Для реализации yield return компилятор делит исходный код на фрагменты и заключает их в класс, который запускает требуемый фрагмент в нужное время, чтобы имитировать функцию, которую можно приостанавливать и возобновлять.