6
votes

Ilist à l'aide de la covariance et de la contrevenance dans C #, est-ce possible?

Cela serait-il possible? (Je n'ai pas vs. 2010, je ne peux donc pas l'essayer moi-même, désolé) xxx

Si je comprends bien, vous pouvez l'utiliser pour mettre en œuvre la covariance et la contraviance dans le même interface.


0 commentaires

3 Réponses :


5
votes

Non, vous ne pouvez pas. Dans votre exemple ilist est invariant. IList nécessiterait de déclarer dans / out pour être covariant / contravaret. Il n'est pas possible de le faire juste en héritant une interface covarienne.


0 commentaires

8
votes

Eh bien, votre question est légèrement déroutante en raison du type existant ilist code>. Cependant, les les em> compilent: xxx pré>

vous pouvez même le modifier pour étendre ienumerable code>: p>

public void Foo(IWritableList<string> x) { ... }

IMyList<object> objects = new MyList<object>();
Foo(objects);


3 commentaires

Cela compilit certainement mais ce ne serait pas co / contra-variant. isimplelist ne peut pas être utilisé comme isimplelist .


Je vais mettre à jour ma réponse pour être plus précis - désolé, pensez toujours tout cela à travers.


Un point n'est pas encore mentionné: en plus de fractionnement des accessoires de lecture de covariants et des accesseurs d'écriture Contravariant, on pourrait également bénéficier de fractionnement des membres tels que le compte, qui sont indépendants de type. Incidemment, il serait possible de trier un objet ressemblant à une liste sans tenir compte du type d'objet contenu dans celui-ci si l'interface fournit des méthodes de comparaison (Index1, Index2) et Swapat (Index1, Index2).



0
votes

Si une mise en œuvre d'une propriété de lecture en lecture était également considérée comme une mise en œuvre d'une propriété en lecture seule, on pourrait ajouter une forme utile de la covariance de la liste et de la contrevenance en présentant une iList (de t) dérive de IReadhablier (of Out T) et iaddlelist (de en t). À condition que ces interfaces comprenaient simplement des éléments présents dans IList (de T) avant leur définition, le code mis en œuvre ilist (de t) appliquerait automatiquement ces autres membres. Malheureusement, pour IREADABLICELIST pour être covariant, il faudrait disposer d'une propriété indexer en lecture seule; La mise en œuvre de la propriété lecture-écriture dans IList n'a pas pu être substituée. Avoir IList (of T) hériter d'une irrablière utilisable (of Out T) briserait ainsi toutes les implémentations d'IList (de T).


0 commentaires