2015-01-02 22 views
7

Zu meiner Überraschung Konvertieren von Array, erhalte ich die folgende Erklärung ab:zu IEnumerable <T>

public static IEnumerable<SomeType> AllEnums 
    => Enum.GetValues(typeof(SomeType)); 

in der Lage zu bemängeln nicht von System.Array-System.Collection.Generic.IEnumerable zu konvertieren. Ich dachte, dass letzterer von ersteren erbte. Anscheinend habe ich mich geirrt.

Da kann ich es nicht LINQ oder .ToList es, ich bin mir nicht sicher, wie man damit richtig umgehen. Ich würde es vorziehen, explizites Casting zu vermeiden, und da es eine Reihe von Werten für eine enum ist, glaube ich nicht, dass als SomeType-es viel Nutzen bringen wird, weder.

+0

'Enum.GetValues' gibt einen' Array' die nicht stark typisierte. Also keine Überraschung hier. –

Antwort

12

Die allgemeine Array Basisklasse ist nicht typisiert, daher implementiert sie keine typspezifischen Schnittstellen; jedoch kann ein Vektor direkt umgewandelt werden - und GetValues gibt tatsächlich einen Vektor zurück; so:

public static IEnumerable<SomeType> AllEnums 
    = (SomeType[])Enum.GetValues(typeof(SomeType)); 

oder vielleicht einfacher:

public static SomeType[] AllEnums 
    = (SomeType[])Enum.GetValues(typeof(SomeType)); 
4

Ich dachte, dass letzterer von ersteren erbte.

Enum.GetValues kehrt Array, die die nicht-generic IEnumerable implementiert, so dass Sie eine Besetzung hinzufügen müssen:

public static IEnumerable<SomeType> AllEnums = Enum.GetValues(typeof(SomeType)) 
    .Cast<SomeType>() 
    .ToList(); 

Das mit LINQ funktioniert, weil Cast<T> Erweiterungsmethode für die nicht-generische IEnumerable Schnittstelle definiert ist , nicht nur auf IEnumerable<U>.

Edit: Ein Aufruf von ToList() Ineffizienz zu vermeiden, die mit mehrfach ein IEnumerable<T> produziert von LINQ Methoden mit verzögerter Ausführung zu Fuß. Danke, Marc, für einen tollen Kommentar!

+0

Dies wird Boxing und Unboxing wann immer es zugegriffen wird, beachten Sie. –

Verwandte Themen