2009-10-27 24 views

Trả lời

36

Mảng T được gán cho ICollection of T, vì một mảng T thực hiện IList của T. IList của T mở rộng ICollection of T, vì vậy bạn có thể chỉ định một mảng cho ICollection.

class Foo {} 

Foo [] foos = new Foo [12]; 
ICollection<Foo> foo_collection = foos; 
+0

Bạn có nói rằng, về cơ bản, không cần phải * chuyển đổi * vì Array đã * là * một ICollection? –

0

Ngoài các câu trả lời và nhận xét, nếu bạn muốn đi cách khác, bạn sử dụng phương pháp ToArray() trên IEnumerable<T> (mà ICollection<T> xuống từ).

20

Câu trả lời ngắn:

Sử dụng ToList(). Đừng dựa vào số T[] có thể được gán cho ICollection<T> trừ khi bạn biết những điều sau và biết bạn đang làm gì.

Nếu bạn cần chỉ đọc, tốt hơn nên sử dụng Array.AsReadOnly(T[]) và tránh sao chép thêm, đồng thời tránh các sự cố được nêu chi tiết bên dưới.


câu trả lời chi tiết:

Mặc dù mảng của T (. Tức là T[]) kỹ thuật thực hiện IList<T> (và ICollection<T>IEnumerable<T>), nó không thực sự thực hiện toàn bộ IList<T>ICollection<T> giao diện , như đã đề cập in the documentation:

... Điều quan trọng cần lưu ý khi bạn truyền một mảng tới một trong các giao diện này là các thành viên thêm, chèn hoặc loại bỏ các phần tử ném NotSupportedException.

Nói cách khác, nếu bạn chỉ truyền mảng đến ICollection<T>, bạn sẽ nhận được NotSupportedException ngay khi bạn gọi bất kỳ phương pháp nào nói trên.

Vì vậy, cách tốt nhất để chuyển đổi một mảng an toàn một ICollection<T> sẽ là để tạo ra một đối tượng mới, chẳng hạn như sử dụng Linq 's ToList():

T[] array; 

// Will create a new list based on the current contents of the array 
ICollection<T> collection = array.ToList(); 
+1

Đây là câu trả lời tốt hơn nhiều, chấp nhận không thực sự đề cập đến "nguy hiểm" của việc đúc chúng mà không cần quan tâm. –

+0

Vì vậy, nếu tôi biết tôi sẽ không sửa đổi bộ sưu tập ở tất cả, nó là an toàn để đúc ICollection ? –

+0

@DanielLorenz nếu bạn muốn nó là chỉ đọc, nó tốt hơn để thực thi nó với ['Array.AsReadOnly (T [])'] (https://docs.microsoft.com/en-us/dotnet/api/system. array.asreadonly? view = netframework-4.7 # System_Array_AsReadOnly__1 ___ 0___) – sinelaw

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