Por que a conversão entre com diferentes parâmetros de tipo não é permitido?
-
12-09-2019 - |
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>();
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).