[C#] Implementing IEnumerable<T>

kruzer25

Основываясь в первую очередь ( :( ) на сообщениях об ошибках, выдаваемых редактором, и во вторую - на MSDN, где этот вопрос как-то не очень освещён, получил следующее:
namespace XXX {

abstract class XXX<T> : System.Collections.Generic.IEnumerable<T> {

abstract public T getByIndex(int iIndex);

abstract public int getLength;

System.Collections.Generic.IEnumerator<T> System.Collections.Generic.IEnumerable<T>.GetEnumerator {
for(int i=0; i<this.getLength; i++) {
yield return this.getByIndex(i);
}
}

System.Collections.IEnumerator System.Collections.IEnumerable.GetEnumerator {
return System.Collections.Generic.IEnumerable<T>)this).GetEnumerator;
}

}

}

(если написать у методов public, непонятно почему получаем сообщение об ошибке "the modifier 'public' is not valid for this item"; определить System.Collections.IEnumerable, насколько я понял, я обязан).
Чувствую, что в этом коде полно говна, а обосновать не могу :(
Что хотелось - сделать так, чтобы по классу, расширяющему IArray<T>, можно было проходить foreach-ем, при этом, там, где этот reach - редактор знал бы, что то, что мы в foreach-е получаем - типа T.
Код с yield взял из msdn, для меня это тёмный лес (но реализовывать самому ручками все эти movenext, current итд влом).

kruzer25

Да, насколько я понимаю - вот это:
			for(int i=0; i<this.getLength; i++) {
yield return this.getByIndex(i);
}

работает так: выполняем цикл, на каждой итерации делаем yield return ... - оно добавляется к какому-то "массиву", который будет возвращён; в результате, в этом массиве оказывается this.getLength делегатов => return this.getByIndex(0 => return this.getByIndex(1 ... которые уже будут выполняться при прохождении снаружи по самому "массиву" (который имеет тип System.Collections.Generic.IEnumerable<T>)?

karkar

Не угадал. Цикл с yield return превращается в конечный автомат с состояниями, посмотри рефлектором.

kruzer25

А где именно находится говно в коде из первого поста, не подскажешь?

Dasar

что ты вообще хочешь?
ps
не понял что ты хочешь, но скорее всего это лучше делать через extension
pps
public ругается - посмотри что такое explicit и implicit interface Implementation

kruzer25

что ты вообще хочешь?
Написать своё массивоподобное, чтобы по нему можно было ходить foreach-ем.
public ругается - посмотри что такое explicit и implicit interface Implementation
А, понял - если мы имплементим метод интерфейса (а это происходит явно, т.к. в имени метода указан интерфейс то он в любом случае должен быть public, и модификаторы видимости не имеют смысла?
Оставить комментарий
Имя или ник:
Комментарий: