将混凝土类型的 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>?
还是有更好的方法?
您必须强制转换列表中的每个项目并创建一个新项目,例如使用 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);
我认为这个变体也是可读的。也许有办法用更多的性能来铸造它......