Possiamo usare GetEnumerator () senza utilizzare l'interfaccia IEnumerable?
-
04-10-2019 - |
Domanda
Ho una classe chiamata Primes e questo implementa classe GetEnumerator () senza implementare interfaccia IEnumerable.
public class Primes
{
private long min;
private long max;
public Primes()
: this(2, 100)
{
}
public IEnumerator GetEnumerator()
{...}
Io non capisco. Mi sto perdendo qualcosa?
Soluzione
In primo luogo, come altri hanno detto è possibile introdurre i propri metodi senza implementazione delle interfacce in ogni caso - si può scrivere il proprio metodo Dispose
senza implementare IDisposable
ecc Per le interfacce ben noti Io suggerirei questo è quasi una cattiva idea (come i lettori avrà determinate aspettative), ma è del tutto valido.
Ancora più importante, però, la dichiarazione foreach
in C # possono lavoro senza IEnumerable
essere coinvolti. Il compilatore fa in modo efficace in fase di compilazione anatra digitando sul nomi GetEnumerator()
, Current
e MoveNext()
. Questo è stato in primo luogo per consentire fortemente tipizzato (e non-boxing) iterazione in C # 1, prima di farmaci generici. Vedere la sezione 8.8.4 della specifica C # 3 per ulteriori dettagli.
Tuttavia, è generalmente una cattiva idea di fare questo ora se non vuole essere in grado di facilità iterare sul contenuto di un'istanza come una collezione - e in effetti io suggerirei IEnumerable<T>
attuazione invece di appena IEnumerable
.
Altri suggerimenti
Sì, è possibile. addirittura si può utilizzare in foreach
. L'unico problema che gli oggetti di questa classe non possono essere gettati al IEnumerable
anche se implementare il metodo necessario.
Non c'è ragione per cui è necessario implementare IEnumerable
al fine di creare una funzione chiamata GetEnumerator
che restituisce un IEnumerator
, che significa solo che non sarà in grado di fornire un esempio di quel tipo a qualcosa che si aspetta un IEnumerable
.
un'interfaccia assicura un contratto, che non significa che non si può avere un metodo con la stessa firma come uno nell'interfaccia su una classe che non impliment l'interfaccia.