2015-01-02 18 views
7

Trước sự ngạc nhiên của tôi, tôi nhận được báo cáo kết quả sau:Chuyển đổi Array IEnumerable <T>

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

để phàn nàn về việc không thể để chuyển đổi từ System.Array-System.Collection.Generic.IEnumerable. Tôi nghĩ rằng sau này được thừa kế từ trước đây. Dường như tôi đã nhầm.

Vì tôi không thể LINQ hoặc .ToList, tôi không chắc chắn cách xử lý đúng cách. Tôi muốn tránh việc đúc rõ ràng và vì đó là một loạt các giá trị cho một enum, tôi không nghĩ rằng là SomeType-nó sẽ được sử dụng nhiều, không.

+0

'Enum.GetValues' trả về một' Array' mà không mạnh mẽ, đánh máy. Vì vậy, không có bất ngờ ở đây. –

Trả lời

12

Lớp cơ sở chung Array không được nhập, do đó, nó không triển khai bất kỳ giao diện kiểu cụ thể nào; tuy nhiên, vectơ có thể được truyền trực tiếp - và GetValues thực sự trả về một vectơ; vậy:

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

hoặc có lẽ đơn giản hơn:

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

Tôi nghĩ rằng sau này được kế thừa từ trước đây.

Enum.GetValues lợi nhuận Array, mà thực hiện các phi generic IEnumerable, vì vậy bạn cần phải thêm một dàn diễn viên:

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

này làm việc với LINQ vì Cast<T> phương pháp mở rộng được xác định cho giao diện phi generic IEnumerable , không chỉ trên IEnumerable<U>.

Edit: Một tiếng gọi của ToList() tránh không hiệu quả kết hợp với đi bộ nhiều lần một IEnumerable<T> sản xuất bằng phương pháp với thực hiện chậm LINQ. Cảm ơn, Marc, cho một bình luận tuyệt vời!

+0

Điều này sẽ được boxing và unboxing bất cứ khi nào nó được truy cập, lưu ý. –

Các vấn đề liên quan