将混凝土类型的 ICollection 浇铸到混凝土类型界面的 ICollec

本文关键字:类型 混凝土 界面 ICollec ICollection | 更新日期: 2023-09-27 18:30:53

ICollection<Bar>转换为Bar实现IBar的位置ICollection<IBar>的推荐方法是什么?

有这么简单吗

collection = new List<Bar>();
ICollection<IBar> = collection as ICollection<IBar>?

还是有更好的方法?

将混凝土类型的 ICollection 浇铸到混凝土类型界面的 ICollec

您必须强制转换列表中的每个项目并创建一个新项目,例如使用 Cast

ICollection<IBar> ibarColl = collection.Cast<IBar>().ToList();

在 .NET 4 中,使用 IEnumerable<T> 的协方差:

ICollection<IBar> ibarColl = collection.ToList<IBar>();

或带List.ConvertAll

ICollection<IBar> ibarColl = collection.ConvertAll(b => (IBar)b);

后者可能更有效,因为它事先知道大小。

不能投射到 ICollection<IBar> ,但可以投射到 IEnumerable<IBar>

因此,如果您不打算向列表中添加某些内容,则可以执行以下操作:

IEnumerable<IBar> enumeration = (IEnumerable<IBar>)collection;

其他答案中的解决方案实际上不会强制转换,而是创建一个新列表,该列表不会反映对原始列表的后续更改。

只需使用 转换所有条目

ICollection<IBar> ibars = collection.ConvertAll(bar => (IBar)bar);

我认为这个变体也是可读的。也许有办法用更多的性能来铸造它......