Jb *_*ain 39
T的数组可分配给T的ICollection,因为T的数组实现了T的IList.IL的T本身扩展了T的ICollection,因此您可以简单地将数组分配给ICollection.
class Foo {}
Foo [] foos = new Foo [12];
ICollection<Foo> foo_collection = foos;
Run Code Online (Sandbox Code Playgroud)
sin*_*law 22
简短回答:
使用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();
Run Code Online (Sandbox Code Playgroud)