什么是在C#中从T[]转换为ICollection的最佳方法?
数组 T
可以赋值给 T
的 ICollection
,因为 T
的数组实现了 T
的 IList
。 T
的 IList
本身扩展了 T
的 ICollection
,所以你可以直接将一个数组赋值给 ICollection
。
class Foo {}
Foo [] foos = new Foo [12];
ICollection<Foo> foo_collection = foos;
简短回答:
使用 ToList()。除非您知道以下内容并且知道自己在做什么,否则不要依赖于将T[]
分配给ICollection<T>
。
如果您需要只读,则最好使用Array.AsReadOnly(T[])
来避免额外的拷贝,并避免下面详细讨论的问题。
详细回答:
尽管 T 数组(即 T[]
)技术上实现了IList<T>
(以及ICollection<T>
和IEnumerable<T>
),但是它并没有完全实现IList<T>
和ICollection<T>
接口,正如文档中所述:
...当你将数组强制转换为这些接口之一时,要注意的关键事项是添加、插入或删除元素的成员会引发
NotSupportedException
异常。
换句话说,如果你只是将数组强制转换为ICollection<T>
,则在调用任何上述方法时会立即获得NotSupportedException
异常。
因此,将数组安全地转换为ICollection<T>
的最佳方法是创建一个新对象,例如使用Linq
的ToList()
:
T[] array;
// Will create a new list based on the current contents of the array
ICollection<T> collection = array.ToList();
ICollection<T>
接口 - 请参见答案。 - sinelaw