转换通用集合

时间:2015-10-28 17:04:42

标签: c# .net generics collections

为什么我可以进行以下转换:

List<String> strings = new List<String>();
IEnumerable<Object> iStrings = strings as IEnumerable<Object>;
List<Object> oStrings = iStrings.ToList();

但我不能直接做到:

List<String> strings = new List<String>();
List<Object> oStrings = strings as List<Object>;

1 个答案:

答案 0 :(得分:2)

IEnumerable<T>covariant,这意味着它可以应用于T的派生类型。如果您在动物园看着一个有几只狮子的展览,那么说你正在看几个动物是完全合理的。

List<T> 不是协变,意味着它无法应用于派生类型。它 当您考虑添加项目时, 适合召唤狮子展示 animal 的集合。你不能在狮子展上添加瞪羚,否则会发生不好的事情。

当您在ToList<object>上致电IEnumerable<object>时,您会创建一个新集合,其中类型为对象。您可以安全地将新对象添加到该列表中。你不能只是&#34;演员&#34; List<string>List<object>,因为这意味着您可以添加除字符串之外的其他对象,但事实并非如此,因为它是 string列表