【问题标题】:How can members of IEnumerable<T> be modified?如何修改 IEnumerable<T> 的成员?
【发布时间】:2016-07-21 14:04:51
【问题描述】:

earlier question about generic variance 中,我被告知IEnumerable&lt;T&gt; 的成员可以修改。如何做到这一点,并且看到当可以修改协变类型时会出现方差冲突,那么IEnumerable&lt;T&gt; 如何与T 保持协变?

【问题讨论】:

  • 我认为您对“成员”和“修改”的含义有些混淆。你能举个例子吗?
  • @ScottHannen 我认为在原始问题中缩短评论讨论并提出新问题而不是澄清是正确的网站礼仪,希望会有一个普遍且非平凡的解释。即我问这个部分是因为我不知道原始评论者指的是什么。
  • 哦,实际上,我现在注意到他说“IEnumerable&lt;T&gt; 的实现”,这强烈暗示 某些子类 不是在 T 上协变的,例如 List&lt;T&gt;,其类型可以在类之外修改。这对于原始问题更有意义,但我仍然不能完全确定这是正确的。
  • @concat 创建一个新问题,而不是在 cmets 中讨论它是可以的,但您仍然需要提供足够的信息在这个问题中才能回答它。跨度>
  • 上下文让我产生疑问:修改IEnumerable&lt;T&gt;的成员?你不能。这是一个框架接口。 OP 所说的“成员”是指集合中的项目,还是集合中项目的属性?同样,通过“修改” - 是指设置属性项还是更改 IEnumerable 引用的引用?

标签: c# collections covariance


【解决方案1】:

你必须区分修改序列和修改它的元素。

您可以毫无问题地修改元素,因为您无法通过使用属性和函数来修改对象的类型。

因此,这一切都很好,因为IEnumerable&lt;T&gt; 中的所有元素都是T 或派生自T 的类型。

您提到的此类违规行为只有在您可以拥有,例如,IEnumerable&lt;Derived&gt; 内的 Base 类型的对象时才会发生

【讨论】:

  • 虽然这完全正确,但在阅读了问题中链接的评论后,我不确定这是要问的问题。
猜你喜欢
  • 2012-01-09
  • 2012-12-19
  • 1970-01-01
  • 2011-05-17
  • 1970-01-01
  • 2014-12-13
  • 2011-09-10
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多