Perché gli array in .net implementano solo IEnumerable e non IEnumerable ?
-
03-10-2019 - |
Domanda
I stava implementando la mia classe ArrayList ed è stato lasciato sorpreso quando ho capito che
public System.Collections.Generic.IEnumerator<T> GetEnumerator() {
return _array.GetEnumerator();
}
non ha funzionato. Qual è la ragione per gli array non implementano IEnumerator in .NET?
C'è un work-around?
Grazie
Soluzione
Array fanno implementare IEnumerable<T>
, ma è fatto come parte della conoscenza speciale CLI ha per gli array. Questo funziona come se si trattasse di un'implementazione esplicita (ma non lo è: è fatto in fase di esecuzione). Molti strumenti non mostrerà questa implementazione, questo è descritto nel Note sezione della panoramica di classe Array
.
Si potrebbe aggiungere un cast:
return ((IEnumerable<T>)_array).GetEnumerator();
Nota, più vecchio MSDN (pre docs.microsoft.com) copertura di questo ha cambiato un paio di volte con diverse versioni di .NET, di controllo per il sezione Osservazioni .
Altri suggerimenti
È possibile utilizzare metodo generico IEnumerable<T> OfType<T>()
da System.Linq namespace, che si estende l'interfaccia IEnumerable. Sarà filtrare tutti elementi che tipo è diverso T e IEnumerable<T> collection
ritorno. Se si utilizza (IEnumerable<T>)_array
operatore di conversione, potrebbe non essere sicuro, perché System.Array
(e di altri tipi non generici) negozi di oggetti di tipo System.Object
.