2009-04-21 3 views

Répondre

4

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

+0

Oui, celui-ci ainsi que celui mentionné dans le post mis à jour. merci –

2

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 .

1

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

+0

Il est actuellement autorisé dans IL commençant par 2.0. C'est juste qu'aucun des compilateurs n'en profite – JaredPar

+0

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 stack = Stack .ConvertFrom (new Stack ); avec la méthode de conversion impliquant une contrainte appropriée sur 'SomeType'. Il est à noter que si la pile est immuable, la conversion peut avoir un sens et être sécurisée même si Stack n'est pas covariant avec T (par exemple, elle a une méthode 'Contains' qui accepte un' T': tester si un 'Stack ' contient une instance de 'Dog' ne devrait pas planter - il devrait juste retourner' false'). – supercat

Questions connexes