Estoy tratando de usar TryGetValue
en un diccionario como de costumbre, como este código a continuación:
Response.Context.Skills[MAIN_SKILL].UserDefined.TryGetValue("action", out var actionObj)
Mi problema es que el propio diccionario podría ser nulo . Simplemente podría usar un "?". antes de UserDefined pero luego recibo el error:
"cannot implicitly convert type 'bool?' to 'bool'"
¿Cuál es la mejor manera en que puedo manejar esta situación? ¿Tengo que verificar si UserDefined
es nulo antes de usar TryGetValue? Porque si tuviera que usar Response.Context.Skills[MAIN_SKILL].UserDefined
dos veces, mi código podría verse un poco desordenado:
if (watsonResponse.Context.Skills[MAIN_SKILL].UserDefined != null && watsonResponse.Context.Skills[MAIN_SKILL].UserDefined.TryGetValue("action", out var actionObj)) { var actionName = (string)actionObj; }
Agregue una verificación nula (operador ??
) después del bool?
expresión:
var dictionary = watsonResponse.Context.Skills[MAIN_SKILL].UserDefined; if (dictionary?.TryGetValue("action", out var actionObj)??false) { var actionName = (string)actionObj; }
Otra opción es comparar con true
.
Se ve un poco extraño, pero funciona con una lógica de tres valores y dice: ¿este valor es true
pero no false
o null
?
if (watsonResponse.Context.Skills[MAIN_SKILL] .UserDefined?.TryGetValue("action", out var actionObj) == true) { var actionName = (string)actionObj; }
Puede hacer la lógica opuesta con != true
: este valor no es true
, entonces es false
o null
if (watsonResponse.Context.Skills[MAIN_SKILL] .UserDefined?.TryGetValue("action", out var actionObj) != true) { var actionName = (string)actionObj; }