2010-05-05 14 views
35

que estaba implementando mi propia clase ArrayList y quedó sorprendido cuando me di cuenta de que¿Por qué las matrices en .net solo implementan IEnumerable y no IEnumerable <T>?

public System.Collections.Generic.IEnumerator<T> GetEnumerator() { 
    return _array.GetEnumerator(); 
} 

no funcionó. ¿Cuál es la razón por la que las matrices no implementan IEnumerator en .NET?

¿Hay algún problema?

Gracias

+4

¿Por qué implementaría su propia clase ArrayList cuando ya hay más de una docena de clases de colección existentes? – Aaronaught

+52

¿Por qué no debería? Estoy cansado de ese tipo de comentarios. –

+4

No le hacemos este tipo de preguntas para molestarlo, sino para averiguar qué es lo que está tratando de hacer. Esto nos ayuda a proporcionarle una mejor respuesta. – Steven

Respuesta

49

matrices hacen aplicar IEnumerable<T>, pero se hace como parte de los conocimientos especiales tiene la CLI para las matrices. Muchas herramientas no mostrarán esta implementación. Consulte el párrafo en las observaciones que comienzan con la nota "Comenzando con .NET Framework 2.0" en el documentation (documentación para versiones anteriores de .NET: busque el bloque "Importante").

Se podría añadir un reparto:

return ((IEnumerable<T>)_array).GetEnumerator(); 
+0

Funciona igual que si la "clase" 'T []' implementara 'IEnumerable 'mediante una implementación _explicit interface_. Si simplemente dices '_array.GetEnumerator()' obtienes el método 'public' que tiene el tipo de devolución incorrecto. –

+0

@RayL Consulte la versión .NET 2.0 de la documentación :-) actualización. – Richard

+0

Solo un aviso. Desde el https://msdn.microsoft.com/en-us/library/system.array.aspx#Remarks referido: implementa las interfaces genéricas 'IList ', 'ICollection ' y 'IEnumerable '. – Wouter

-1

Puede utilizar el método genérico IEnumerable<T> OfType<T>() de System.Linq espacio de nombres, que se extiende interfaz IEnumerable. Filtrará todos los elementos cuyo tipo sea diferente de T y devolverá IEnumerable<T> collection. Si utiliza el operador de conversión (IEnumerable<T>)_array, puede que no sea seguro, porque System.Array (y otros tipos no genéricos) almacena elementos del tipo .

+0

Solo las matrices de objetos (es decir, 'Object [] arr') almacenan el elemento como un objeto. Aparte de esos, los arreglos son seguros. Eso hace que los métodos OfType y Cast sean redundantes. – jmoreno

Cuestiones relacionadas