当前位置:  开发笔记 > 编程语言 > 正文

无法将List <T>隐式转换为Collection <T>

如何解决《无法将List<T>隐式转换为Collection<T>》经验,为你挑选了3个好方法。

这是编译器错误(为了便于阅读,略有改动).

这个总是困惑我.FxCop告诉我返回List是一件坏事,而派生的Collection派对应该是优先的返回类型.

此外,FxCop表示可以List用于内部数据存储\操作.好吧,我明白了,但我没有得到的是编译器抱怨尝试隐式转换ListCollection.没有List更多的接口充电和功能?为什么要禁止隐式转换?

另一个源于上述问题:new List(some collection)构造函数昂贵吗?

谢谢,

瓦伦丁瓦西里耶夫



1> Matthew M...:

为什么不这样做:

Collection collection = new Collection(theList);

as Collection(IList输入)将List作为构造的一部分.



2> Jon Skeet..:

List不是来自Collection- 它确实实现了ICollection.这将是返回类型的更好选择.

至于new List(some collection)问题 - 它部分取决于收集的内容.如果它实现ICollection(在执行时),那么构造函数可以使用其Count属性创建具有正确初始容量的列表,然后迭代它并添加每个项目.如果它没有实现ICollection那么它只相当于:

List list = new List();
foreach (int x in otherCollection)
{
    list.Add(x);
}

在一个方便的构造函数中仍然很好,但效率不高 - 它不可能,真的.

我不相信构造函数会对数组做任何狡猾的事情,它可能会使用Array.Copy或者只是一次性复制批次而不是迭代.(同样,如果它是另一个,List它可以进入后备阵列并直接复制.)



3> David Morton..:

List不继承自Collection.干净利落.除非List提供操作符隐式转换为/从Collection,否则您无法执行此操作.我实际上会建议List你回来,因为我相信这些规则是这样的:

作为参数接受可能的最不紧缩的接口.作为返回参数返回可能的最紧缩类型.

推荐阅读
mylvfamily
这个屌丝很懒,什么也没留下!
DevBox开发工具箱 | 专业的在线开发工具网站    京公网安备 11010802040832号  |  京ICP备19059560号-6
Copyright © 1998 - 2020 DevBox.CN. All Rights Reserved devBox.cn 开发工具箱 版权所有