web-dev-qa-db-fra.com

L'équivalent C # de Java <? étend Base> en génériques

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>();
58
Louis Rhys

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 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.

92
Raystorm

Examinez Covariance et Contravariance introduit avec .Net 4.0. Mais cela ne fonctionne qu'avec interfaces pour le moment.

Exemple:

IEnumerable<Base> list = new List<SubClass>();
8
decyclone

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 .

6
Mehrdad

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;
1
Guilherme Argentino