2016-07-21 1 views
0

Dans un earlier question about generic variance, j'ai été informé que les membres de IEnumerable<T> peuvent être modifiés. Comment cela peut-il être fait et, vu que des violations de variance apparaissent quand un type covariant peut être modifié, comment alors IEnumerable<T> peut-il être covariant sur T?Comment les membres de IEnumerable <T> peuvent-ils être modifiés?

+0

Je pense qu'il ya une certaine confusion sur ce que vous entendez par « membres » et « modifiés ». Pouvez vous donner un exemple? –

+0

@ ScottHannen Je pensais que l'étiquette du site approprié pour couper la discussion de commentaire court dans la question initiale et faire une nouvelle question au lieu de clarifier, en espérant qu'il y aurait une interprétation dominante et non trivial. C'est-à-dire que j'ai posé cette question en partie parce que je ne sais pas à quoi fait référence le commentateur original. – concat

+0

Oh, en fait, je remarque maintenant qu'il dit "implémentation de' IEnumerable '" qui indique fortement _some subclass_ pas covariant sur 'T', comme un' Liste ', dont le type pourrait être ** modifié ** en dehors de la classe . Cela a beaucoup plus de sens pour la question initiale, mais je ne suis toujours pas tout à fait sûr que ce soit vrai. – concat

Répondre

5

Vous devez distinguer la modification de la séquence de la modification de ses éléments.

Vous pouvez modifier les éléments sans aucun problème, car vous ne pouvez pas modifier le type de l'objet en utilisant les propriétés et fonctions qu'il contient. Et ainsi, tout va bien, puisque tous les éléments dans IEnumerable<T> sont T ou le type dérivé de T.

Ces violations que vous évoquez ne pourraient se produire si vous pouviez avoir pu, par exemple, un objet de type Base intérieur IEnumerable<Derived>

+0

Bien que ce soit * entièrement * correct, après avoir lu le commentaire lié à la question, je ne suis pas sûr que ce soit ce qui est demandé. –