C # est l'équivalent de Java dans les génériques

En Java, je peux faire ce qui suit: (supposons Subclass s'étend Base):

ArrayList<? extends Base> aList = new ArrayList<Subclass>();

Quel est l'équivalent en C#. NET? il n'y a pas de mot-clé ? extends apparemment et cela ne fonctionne pas:

List<Base> aList = new List<Subclass>();
50
demandé sur Louis Rhys 2011-01-19 09:51:57

4 réponses

En fait, il existe un équivalent(en quelque sorte), le mot-clé where. Je ne sais pas comment "fermer" il est. J'avais une fonction pour laquelle je devais faire quelque chose de similaire.

J'ai trouvé une page msdn à ce sujet.

Je ne sais pas si vous pouvez le faire en ligne pour une variable, mais pour une classe que vous pouvez faire:
public class MyArray<T> where T: someBaseClass
ou pour une fonction
public T getArrayList<T>(ArrayList<T> arr) where T: someBaseClass

Je ne l'ai pas vu sur la page mais en utilisant le mot-clé where, Il pourrait être possible pour une variable.

80
répondu Raystorm 2018-01-11 18:07:41

Regarder dans Covariance et Contravariance introduit avec .Net 4.0. Mais cela ne fonctionne qu'avec interfaces en ce moment.

Exemple:

IEnumerable<Base> list = new List<SubClass>();
8
répondu decyclone 2011-01-19 06:55:47

Il N'y a pas d'équivalent exact (puisque le système de type ne fonctionne pas de la même manière, avec effacement de type et tout), mais vous pouvez obtenir des fonctionnalités très similaires avec in et out en utilisant covariance et contravariance .

5
répondu Mehrdad 2011-01-19 06:54:47

Si vous cherchez deux génériques de type, jetez un oeil à ceci:

    void putAll<K1, V1>(Dictionary<K1,V1> map) where K1 : K where V1 : V;
1
répondu Guilherme Argentino 2015-07-29 01:05:35