Pergunta

Eu tenho:

IDictionary<string, IDictionary<string, IList<long>>> OldDic1; 

(apenas para fins de ilustração, ele é instanciado e tem valores - em outro lugar)

Por que eu posso fazer isso:?

Dictionary<string, IDictionary<string, IList<long>>> dic1 = 
  OldDic1 as Dictionary<string, IDictionary<string, IList<long>>>;

Basicamente dic1 depois de executar esta linha tem todos os valores de OldDic1; obras.

No entanto, quando eu faço isso:

Dictionary<string, Dictionary<string, List<long>>> dic1 = 
  OldDic1 as Dictionary<string, Dictionary<string, List<long>>>;

Eu recebo nula, é o mesmo que lançar exceto que ele não bater e em vez disso, retorna nulo. Então a questão é por que não posso lançá-lo a partir das interfaces para tipos? há solução, outra em seguida, mudando a forma como ele é armazenado em primeiro lugar?

Foi útil?

Solução

Você só pode re-lançar o nome de interface / classe mais externa, e não os parâmetros genéricos. A razão a sua segunda elenco não funciona é a mesma razão que você não pode lançar a partir de um tipo de matriz para outro, mesmo se você pode lançar o "contido" objetos. Eis o porquê:

List<object> objects;
List<string> strings;

objects = strings as List<object>;
// Uh oh, that's not a string!
objects.Add(42); 

objects = new List<object> { "The", "answer", "is", 42 };
// Uh oh, now strings contains an integer?
strings = objects as List<string>;

A mesma coisa aconteceria em seu segundo caso. Você pode adicionar algum tipo de IDictionary para OldDic1 que não é realmente um Dictionary, e depois dic1 iria explodir. Ele teria um valor não-Dictionary. Ruh roh!

Então, quando você tem recipientes que você pode mudar de IList<X> para List<X> e volta, desde que X é idênticas para cada um.

Outras dicas

O comportamento está relacionado com a como palavra-chave em C #. Um dicionário não é a mesma coisa que um IDictionary.

Se você estava lançando para o outro lado, você pode ser capaz de obtê-lo para trabalhar na próxima versão do .NET que aumentou o suporte para covariância e contravariance .

A solução que você pode querer determinar por você precisa elenco para o concreto Dicionário / List, e se for necessário, altere o armazenamento do tipo.

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