ОК, только что попробовал, и я понимаю, что вы имеете в виду. Это больно! Я подозреваю, что это связано с закулисной работой, которую выполняет компилятор (создание вложенных классов и тому подобное) для реализации логики машинного состояния с возможностью восстановления состояния для yield
. Один из способов обойти это (способ, которым я первоначально попробовал ваш код) - сделать метод Validate
статичным, хотя, очевидно, это не очень хорошо для дизайна.
Я думаю, что причина, по которой сообщение об ошибке настолько тупое, заключается в некоторой комбинации:
- Сгенерированные классы не существуют в вашем источнике, поэтому у VS нет имен, по которым можно ссылаться на них.
- IIRC, имена, сгенерированные компилятором, содержат символы, недопустимые в идентификаторах C #, но допустимые в базовой системе типов Framework.
У меня сейчас нет Reflector под рукой, поэтому я не могу подтвердить, но если вы чувствуете себя как пятно легкого мазохизма, подумайте над своей сборкой и посмотрите на код, который пишет компилятор, чтобы позволить смертные используют хороший синтаксический сахар, такой как yield return
:) В Интернете много информации о том, как именно все это работает.
Редактировать: после небольшого поиска, пара лучших:
http://blogs.msdn.com/b/ericlippert/archive/tags/iterators/
http://csharpindepth.com/Articles/Chapter6/IteratorBlockImplementation.aspx