从Array转换为ICollection <T>

LB.*_*LB. 15 c#

在C#中实现这一目标的最佳方法是什么?

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>是创建一个新的对象,如使用LinqToList():

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)

  • 这是更好的答案,接受并没有真正提到毫不关心地投射到这些的“危险”。 (2认同)