Je ne comprends tout simplement pas, car il serait très utile de convertir un conteneur générique dans l'autre?Pourquoi la conversion entre différents paramètres de type n'est PAS autorisée?
Stack <IType> stack = new Stack<SomeType>();
Je ne comprends tout simplement pas, car il serait très utile de convertir un conteneur générique dans l'autre?Pourquoi la conversion entre différents paramètres de type n'est PAS autorisée?
Stack <IType> stack = new Stack<SomeType>();
Parlez-vous des conversions comme ça?
IFoo<Child> child = ...;
IFoo<Parent> parent = child;
Si c'est le cas, c'est ce que l'on appelle la covariance. Ceci est généralement associé à sa contrepartie contravariant. Cette fonctionnalité n'est en effet pas disponible dans la version actuelle de C#. Mais il sera disponible dans la prochaine version de C# et VB.Net.
Quelques articles sur la prochaine version
Oui, celui-ci ainsi que celui mentionné dans le post mis à jour. merci –
Alors ce que dit @JaredPar est vrai, il y a des contournements pour les collections qui sont disponibles aujourd'hui. Par exemple, vous pouvez utiliser l'extension Cast IEnumerable s'il existe une distribution légale d'un type à un autre.
List<Foo> list = barList.Cast<Foo>().ToList();
Ou vous pouvez convertir explicitement d'un type à un autre en utilisant Sélectionner.
List<double> dList = intList.Select(i => Convert.ToDouble(i)).ToList();
Notez que ces deux méthodes produira une nouvelle collection du type approprié, ne pas attribuer simplement la collection à une variable d'un autre type que sera disponible sous certaines conditions dans les prochaines versions de C#/VB .
En ce qui concerne l'exemple que vous avez donné:
Stack <IType> stack = new Stack<SomeType>();
Que se passerait-il si nous l'avons fait:
stack.Add(new SomeOtherTypeNotDerivedFromSomeType());
C'est la raison fondamentale pour laquelle covariance est pas autorisée dans .Net, je suppose parce que la collection sous-jacente pour le conteneur générique ne correspond pas nécessairement au type déclaré. Les articles d'Eric Lippert vont dans les moindres détails (plus que je ne peux vraiment).
Il est actuellement autorisé dans IL commençant par 2.0. C'est juste qu'aucun des compilateurs n'en profite – JaredPar
Si les opérateurs de casting peuvent être génériques, il peut être logique d'avoir un code tel que décrit être équivalent à Stack
Pourriez-vous nous montrer un exemple de ce que vous essayez de faire? –