Pregunta

Es que no lo entiendo, ya que sería tan útil para convertir un contenedor genérico en el otro?

Stack <IType> stack = new Stack<SomeType>();
¿Fue útil?

Solución

¿Está hablando de conversiones como tal?

IFoo<Child> child = ...;
IFoo<Parent> parent = child;

Si es así, esto es lo que se conoce como la covarianza. Esto generalmente se empareja con su homólogo contravariante. Esta función no está de hecho disponible en la versión actual de C #. Pero estará disponible en la próxima versión de C # y VB.Net.

Algunos artículos sobre la próxima versión

Otros consejos

Mientras lo @JaredPar dice es cierto, hay algunas soluciones temporales para colecciones que están disponibles hoy en día. Por ejemplo, puede utilizar la extensión IEnumerable Cast si hay un reparto legal de un tipo a otro.

List<Foo> list = barList.Cast<Foo>().ToList();

O se podría convertir explícitamente de un tipo a otro utilizando Seleccionar.

List<double> dList = intList.Select( i => Convert.ToDouble( i ) ).ToList();

Tenga en cuenta que ambos de estos métodos producirá una nueva colección de tipo adecuado, y no simplemente asignar la colección a una variable de un tipo diferente como será disponible bajo ciertas condiciones en las próximas versiones de C # / VB.

Con respecto al ejemplo que diste:

Stack <IType> stack = new Stack<SomeType>();

¿Qué pasaría si hacemos esto:

stack.Add(new SomeOtherTypeNotDerivedFromSomeType());

Esta es la razón básica por la covarianza no está permitido en .Net, supongo que porque la colección subyacente para el contenedor genérico no necesariamente coincide con el tipo declarado. Los artículos de Eric Lippert entrar en gran detalle (más de lo que realmente puede).

Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top