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