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>();
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 fonctionpublic 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.
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>();
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 .
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;