IDictionary, dicionário
-
21-08-2019 - |
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?
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.