【问题标题】:Conversion of generic collections [duplicate]通用集合的转换[重复]
【发布时间】:2015-10-28 17:04:42
【问题描述】:

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

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>;

【问题讨论】:

  • 我不明白这个问题。 .ToList() 调用一个方法。除了这个词的简单英语含义之外,它不会强制转换或转换,这在您的其余问题中对我来说没有意义。你能详细说明一下吗?
  • @hvd 它确实转换。它不会投射。
  • @Servy 在这个词的简单英语含义中,也许。在这个词的 C# 含义中,它没有。这个问题向我暗示了(可能是错误的)这个词的 C# 含义。我已经在评论中提到了这一点。
  • @hvd 否。这是转换对象,在 C# 的单词含义中。创建一个包含在概念上与另一个相同的内容的新对象就是在 C# 中将一个对象“转换”为另一种类型的意思,这正是 ToList 正在做的事情。
  • @Servy 在 C# 语言规范中,据我所见,“转换”仅表示隐式类型转换和显式转换,显式转换是强制转换。我不知道你在想什么其他可能的 C# 含义。

标签: c# .net generics collections


【解决方案1】:

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

List&lt;T&gt;协变的,这意味着它不能应用于派生类型。它 当您考虑添加项时,适合称为狮子会展示动物的集合。您不能在狮子展览中添加瞪羚,否则会发生坏事。

当您在IEnumerable&lt;object&gt; 上调用ToList&lt;object&gt; 时,您将创建一个新集合,其中引用类型为对象。您可以安全地将新对象添加到该列表中。您不能只是将List&lt;string&gt;“转换”为List&lt;object&gt;,因为这意味着您可以添加除字符串之外的其他对象,但事实并非如此,因为它是strings 的列表 em>。

【讨论】:

  • 感谢您的解释。但是为了允许转换我的自定义泛型类(如 Custom ct1 = new Custom(); Custom ct2 = (Custom)ct1 )我应该在我的 Custom 班级?
猜你喜欢
  • 1970-01-01
  • 2012-07-25
  • 2011-01-29
  • 1970-01-01
  • 2017-07-18
  • 1970-01-01
  • 2017-02-27
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多