En Java, je peux faire ce qui suit: (supposons que Subclass
étend Base
):
ArrayList<? extends Base> aList = new ArrayList<Subclass>();
Quel est l'équivalent en C # .NET? Il n'y a pas ? extends
mot clé apparemment et cela ne fonctionne pas:
List<Base> aList = new List<Subclass>();
En fait, il existe un équivalent (en quelque sorte), le mot clé where
. Je ne sais pas à quel point c'est "proche". J'avais une fonction pour laquelle je devais faire quelque chose de similaire.
J'ai trouvé un page msdn à ce sujet.
Je ne sais pas si vous pouvez le faire en ligne pour une variable, mais pour une classe, vous pouvez le 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.
Examinez Covariance
et Contravariance
introduit avec .Net 4.0
. Mais cela ne fonctionne qu'avec interfaces
pour le moment.
IEnumerable<Base> list = new List<SubClass>();
Il n'y a pas équivalent exact (puisque le système de type ne fonctionne pas de la même manière, avec l'effacement de type et tout), mais vous pouvez obtenir très fonctionnalités similaires avec in
et out
utilisant covariance et contravariance .
Si vous recherchez deux génériques de type, jetez un œil à ceci:
void putAll<K1, V1>(Dictionary<K1,V1> map) where K1 : K where V1 : V;