Me topé con lo siguiente y me pregunto por qué no generó un error de sintaxis.
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 falta "," entre "MyA" y "OtherAs".
Aquí es donde ocurre la confusión:
- El código se compila.
- El diccionario final "dict" contiene solo tres elementos: "Id", "Tribus" y "MyA".
- Los valores para todos excepto "MyA" son correctos,
- "MyA" toma el valor declarado para "OtherAs", mientras que su valor original se ignora.
¿Por qué no es esto ilegal? ¿Es esto por diseño?
c#
dictionary
initialization
Dantte
fuente
fuente
OtherAs
se agregó como una clave en lo que sería elMyA
diccionario. (Nombre = Solo, Puntos = 88 más Otros Como = Lista <Diccionario <cadena, objeto >>) excepto que nunca lo asigna . En su lugar, coloca la lista de dictados, que ahora solo contiene la única entrada Puntos = 1999 en laMyA
ranura que anula lo que uno pensaría que pertenece allí.<string, string> and modify Points to
"88" `, aparece un error del compilador" No se puede convertir implícitamente el tipo 'System.Collections.Generic.List <System.Collections.Generic.Dictionary <string, object >>' a 'string' " que realmente me ayudó a encontrar la respuesta!var test = new Dictionary<string, object> { ["Name"] = "Solo", ["Points"] = 88 }["OtherAs"] = new List<Dictionary<string, object>> { new Dictionary<string, object> { ["Points"] = 1999 } };
te lo explicaré más a fondo.Respuestas:
La coma que falta hace toda la diferencia. Hace que el indexador
["OtherAs"]
se aplique en este diccionario:Entonces esencialmente estás diciendo:
Tenga en cuenta que esta es una expresión de asignación (
x = y
). Aquíx
hay un diccionario con "Nombre" y "Puntos", indexado con"OtherAs"
yy
es elList<Dictionary<string, object>>
. Una expresión de asignación evalúa el valor que se asigna (y
), que es la lista de diccionarios.El resultado de toda esta expresión se asigna a la clave "MyA", por lo que "MyA" tiene la lista de diccionarios.
Puede confirmar que esto es lo que está sucediendo cambiando el tipo de diccionario
x
:Aquí está su código, pero reformateado y algunos paréntesis agregados para ilustrar cómo el compilador lo ha analizado:
fuente
object
astring
que me dio un mensaje de error similar y el momento aha que provocó la respuesta. Parece que me ganasteLo que sucede aquí es que está creando un diccionario y luego lo está indexando. Luego se devuelve el resultado de la expresión de indexación / asignación y eso es lo que se asigna a la
MyA
ranura del diccionario.Esta:
Se puede dividir en el siguiente código psuedo:
Se devuelve el resultado de la asignación al indexador del segundo diccionario (la asignación devuelve el valor asignado / lado derecho) Ese diccionario es un local temporal que simplemente "desaparece en el éter". El resultado del indexador (la lista de diccionarios) es lo que se coloca en el diccionario principal al final.
Este es un caso extraño, en el que se hace más fácil caer debido al uso de
object
como el tipo de valores del diccionario.fuente