Eu me deparei com o seguinte e estou me perguntando por que não gerou um erro de sintaxe.
var dict = new Dictionary<string, object>
{
["Id"] = Guid.NewGuid(),
["Tribes"] = new List<int> { 4, 5 },
["MyA"] = new Dictionary<string, object>
{
["Name"] = "Solo",
["Points"] = 88
}
["OtherAs"] = new List<Dictionary<string, object>>
{
new Dictionary<string, object>
{
["Points"] = 1999
}
}
};
Observe que "," está ausente entre "MyA" e "OtherAs".
É aqui que a confusão acontece:
- O código é compilado.
- O dicionário final "dict" contém apenas três elementos: "Id", "Tribes" e "MyA".
- O valor para todos, exceto "MyA", está correto,
- "MyA" aceita o valor declarado para "OtherAs", enquanto seu valor original é ignorado.
Por que isso não é ilegal? Isso é intencional?
c#
dictionary
initialization
Dantte
fonte
fonte
OtherAs
é adicionado como uma chave para o que seria oMyA
dicionário. (Nome = Solo, Pontos = 88 mais OtherAs = Lista <Dicionário <string, objeto >>), exceto que nunca o atribui . Em vez disso, coloca a lista de ditados, agora contendo apenas a entrada Points = 1999 noMyA
slot, substituindo o que se pensaria pertencer a esse local.<string, string> and modify Points to
"88", você receberá um erro do compilador "Não é possível converter implicitamente o tipo 'System.Collections.Generic.List <System.Collections.Generic.Dictionary <string, object >>' para 'string'" o que realmente me ajudou a descobrir a resposta!var test = new Dictionary<string, object> { ["Name"] = "Solo", ["Points"] = 88 }["OtherAs"] = new List<Dictionary<string, object>> { new Dictionary<string, object> { ["Points"] = 1999 } };
, explicará melhor.Respostas:
A vírgula ausente faz toda a diferença. Faz com que o indexador
["OtherAs"]
seja aplicado neste dicionário:Então, basicamente, você está dizendo:
Observe que esta é uma expressão de atribuição (
x = y
). Aquix
está o dicionário com "Nome" e "Pontos", indexados com"OtherAs"
ey
é oList<Dictionary<string, object>>
. Uma expressão de atribuição é avaliada para o valor que está sendo atribuído (y
), que é a lista de dicionários.O resultado dessa expressão inteira é atribuído à chave "MyA", e é por isso que "MyA" tem a lista de dicionários.
Você pode confirmar que é isso que está acontecendo alterando o tipo do dicionário
x
:Aqui está o seu código, mas reformatado e alguns parênteses adicionados para ilustrar como o compilador o analisou:
fonte
object
para ostring
que me deu uma mensagem de erro semelhante e o momento aha que deu a resposta. Parece que você me venceu - eu culpo digitando a resposta no meu telefone :-pO que está acontecendo aqui é que você está criando um dicionário e indexando-o. O resultado da expressão indexador / atribuição é retornado e é isso que está sendo atribuído ao
MyA
slot do dicionário.Este:
Pode ser dividido no seguinte código psuedo:
O resultado da atribuição ao indexador do segundo dicionário é retornado (a atribuição retorna o valor atribuído / lado direito). Esse dicionário é um local temporário que apenas "desaparece no éter". O resultado do indexador (a lista de dicionários) é o que é colocado no dicionário principal no final.
Este é um caso estranho, que é mais fácil de se encaixar devido ao uso
object
como valores do tipo do dicionário.fonte