Ну, так как вы реализуете оба GetEnumerator
методы явно, вы можете сделать это:
IEnumerator IEnumerable.GetEnumerator()
{
return ((IEnumerable<Type>)this).GetEnumerator();
}
Но у меня есть два вопроса:
- Почему вы хотите явно реализовать оба интерфейсы?Это совсем не идиоматично.(РЕДАКТИРОВАТЬ: теперь понятно, почему; это сгенерированный код).
- Этот код даже написан человеком?Подозрительно похоже на то, что компилятор C # генерирует для блоков итераторов.Если да, то как вы к этому попали?Декомпилятор?Обратите внимание, что для декомпиляторов обычно срабатывает правильный IL и создается код C #, который не компилируется.
РЕДАКТИРОВАТЬ: я посмотрел на декомпилированный код дляблок итератора с Reflector (я подозреваю это декомпилятор, который вы используете?).Похоже, он демонстрирует эту ошибку, то есть неуниверсальная версия декомпилируется как явно недействительная:
return this.System.Collections.Generic.IEnumerable<Foo>.GetEnumerator();
РЕДАКТИРОВАТЬ: другие исправления, которые вам нужно получить для компиляции, выглядят так:
- Измените доступность метода
MoveNext
на public
. - Удалите упоминания
ExpressionParser.
в методе generic GetEnumerator
.
Вы можете попробовать его на Ideone .
foreach (Type t in new SelfAndBaseClasses(0) { type = typeof(string) })
Console.WriteLine(t);
Выход:
System.String
System.Object
Если вымогли бы лучше объяснить, что вы действительно хотите сделать, мы можем помочь вам лучше.Исправлять некорректно декомпилированный код не весело.Например, если вам нужно написать перечислитель для иерархии типов, то это будет намного проще сделать с блоком итератора, чем пытаться декомпилировать Dynamic LINQ.