Pergunta

Eu só não entendo como ele seria tão útil para converter um contêiner genérico para o outro?

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

Solução

Você está falando de conversões como assim?

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

Se assim for, isso é o que é conhecido como co-variância. Isso geralmente é emparelhado com o seu homólogo contravariant. Este recurso não é realmente disponível na versão atual do C #. Mas ele estará disponível na próxima versão do C # e VB.Net.

Alguns artigos sobre o lançamento

Outras dicas

Enquanto o @ JaredPar diz é verdade, existem algumas soluções alternativas para as coleções que estão disponíveis hoje. Por exemplo, você pode usar o elenco extensão IEnumerable se houver um elenco legal de um tipo para outro.

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

Ou você poderia explicitamente converter de um tipo para outro usando Select.

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

Note-se que ambos os métodos irá produzir uma nova coleção do tipo apropriado, e não simplesmente atribuir a coleção para uma variável de um tipo diferente, estará disponível sob determinadas condições nas próximas versões do C # / VB.

No que diz respeito ao exemplo que você deu:

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

O que aconteceria se fizéssemos isso:

stack.Add(new SomeOtherTypeNotDerivedFromSomeType());

Esta é a razão básica pela qual covariância não é permitido em .Net, eu acho, porque a coleção subjacente para o contêiner genérico não necessariamente coincidir com o tipo declarado. Os artigos de Eric Lippert entrar em grandes detalhes (mais do que eu realmente puder).

Licenciado em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top