Podemos utilizar GetEnumerator () sin usar la interfaz IEnumerable?
-
04-10-2019 - |
Pregunta
Tengo una clase llamada Primes y esta clase implementa GetEnumerator () sin implementar la interfaz IEnumerable.
public class Primes
{
private long min;
private long max;
public Primes()
: this(2, 100)
{
}
public IEnumerator GetEnumerator()
{...}
No lo entiendo. Me estoy perdiendo algo?
Solución
En primer lugar, como otros han dicho que puede introducir sus propios métodos sin la implementación de las interfaces de todos modos - usted puede escribir su propio método Dispose
sin implementar IDisposable
etc. Para las interfaces conocidas me gustaría sugerir esto es casi una mala idea (como lectores tendrá ciertas expectativas), pero es totalmente válida.
Más importante, sin embargo, la declaración foreach
en C # puede IEnumerable
trabajo sin estar involucrado. El compilador hace efectiva la tipificación de pato en tiempo de compilación en el GetEnumerator()
nombres, Current
y MoveNext()
. Esto fue principalmente para permitir fuertemente mecanografiada (y no el boxeo) iteración en C # 1, antes de que los genéricos. Véase la sección 8.8.4 de la especificación C # 3 para más detalles.
Sin embargo, es generalmente una mala idea hacer esto ahora si no quiere ser capaz de fácil iterar sobre el contenido de una instancia como una colección - y, de hecho me gustaría sugerir IEnumerable<T>
implementar vez de poco IEnumerable
.
Otros consejos
sí se puede. incluso se puede usar en foreach
. El único problema que los objetos de esta clase no se pueden echar a IEnumerable
a pesar de que implementan el método necesario.
No hay razón por la que hay que poner en práctica IEnumerable
con el fin de crear una función llamada GetEnumerator
que devuelve un IEnumerator
, eso significa solamente que usted no será capaz de suministrar una instancia de ese tipo a algo que espera un IEnumerable
.
una interfaz asegura un contrato, eso no significa que no se puede tener un método con la misma firma como uno en la interfaz en una clase que no impliment la interfaz.