Rozważmy dwie metody iteracyjnej z tych samych korpusów:Czy istnieje jakaś różnica między metodami iteratora, które zwracają liczbę IEnumerable <T> i IEnumerator <T>?
public static IEnumerable<int> It1() {
...
}
public static IEnumerator<int> It2() {
...
}
Czy istnieje okoliczność gdzie nazywając It2
różni się od wywoływania It1.GetEnumerator()
?
Czy istnieje jakiś dobry powód, aby zdefiniować iterator jako IEnumerator<T>
przez IEnumerable<T>
? Jedyne, o czym mogę pomyśleć, to kiedy implementujesz IEnumerable<T>.GetEnumerator()
.
EDYTOWANIE: Metodami iteracyjnymi mam na myśli metody wykorzystujące konstrukcje yield return
i yield break
.
Ściśle mówiąc implementacje metod nie może być taka sama. –
Oczywiście, że może. public static IEnumerable It1() { zwrot plonu 1; } public static IEnumerator It2() { zwrot plonu 1; } –
Teraz to, co kompilator konwertuje je w oczywisty sposób różni się; jeden zostaje przekonwertowany na anonimową klasę implementującą IEnumerator, a drugi na dwie anonimowe klasy implementujące IEnumerable i IEnumerator . Czy istnieje przypadek, w którym dwa IEnumeratory są różne? –