2010-05-05 6 views
35

ich meine eigene Klasse Arraylist Implementierung und wurde überrascht verlassen, als ich, dassWarum implementieren Arrays in .net nur IEnumerable und nicht IEnumerable <T>?

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

nicht funktionierte. Aus welchem ​​Grund implementieren Arrays IEnumerator nicht in .NET?

Gibt es einen Workaround?

Dank

+4

Warum würden Sie Ihre eigene ArrayList-Klasse implementieren, wenn es bereits über ein Dutzend vorhandener Auflistungsklassen gibt? – Aaronaught

+52

Warum sollte ich nicht? Ich bin dieser Art von Kommentaren müde. –

+4

Wir stellen diese Art von Fragen nicht, um Sie zu nerven, sondern um herauszufinden, was Sie versuchen zu tun. Dies hilft uns, Ihnen eine bessere Antwort zu liefern. – Steven

Antwort

49

Arrays tun IEnumerable<T> implementieren, aber es wird als Teil der speziellen Kenntnisse getan die CLI für Arrays hat. Viele Tools zeigen diese Implementierung nicht an. Lesen Sie den Abschnitt in den Anmerkungen, der mit "Starten mit .NET Framework 2.0" beginnt, in der documentation (Dokumentation für frühere .NET-Versionen: Suchen Sie nach dem Block "Wichtig").

Sie könnten einen insg:

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

Es funktioniert so, als ob die "Klasse" 'T []' 'IEnumerable ' durch eine _explicit-Schnittstellenimplementierung_ implementiert hätte. Wenn Sie einfach '_array.GetEnumerator()' sagen, erhalten Sie stattdessen die 'public' Methode, die den falschen Rückgabetyp hat. –

+0

@RayL Siehe die .NET 2.0 Version der Dokumentation :-) Aktualisierung. – Richard

+0

Nur ein Kopf hoch. Von den referenzierten https://msdn.microsoft.com/en-us/library/system.array.aspx#Remarks: es implementiert 'IList ', 'ICollection ' und 'IEnumerable ' generische Schnittstellen. – Wouter

-1

Sie generische Methode IEnumerable<T> OfType<T>() aus System.Linq Namespace verwenden, die IEnumerable-Schnittstelle erweitert. Es wird alle Elemente herausgefiltert, deren Typ sich von T unterscheidet, und IEnumerable<T> collection zurückgeben. Wenn Sie den Konvertierungsoperator (IEnumerable<T>)_array verwenden, ist dieser möglicherweise nicht sicher, da System.Array (und andere nicht generische Typen) Elemente des Typs System.Object speichern.

+0

Nur Arrays von Objekten (z. B. 'Objekt [] arr') speichern das Objekt als Objekt. Anders als diese sind Arrays typsicher. Das macht die OfType-Methode und die Cast-Methode überflüssig. – jmoreno

Verwandte Themen