在空字典上尝试获取值
TryGetValue on a null dictionary
我正在尝试像往常一样在字典上使用 TryGetValue
,如下面的代码:
Response.Context.Skills[MAIN_SKILL].UserDefined.TryGetValue("action", out var actionObj)
我的问题是字典本身可能为空。我可以简单地使用一个“?”。在 UserDefined 之前,但随后我收到错误:
"cannot implicitly convert type 'bool?' to 'bool'"
处理这种情况的最佳方法是什么?在使用 TryGetValue 之前是否必须检查 UserDefined
是否为空?因为如果我不得不使用 Response.Context.Skills[MAIN_SKILL].UserDefined
两次,我的代码可能看起来有点乱:
if (watsonResponse.Context.Skills[MAIN_SKILL].UserDefined != null &&
watsonResponse.Context.Skills[MAIN_SKILL].UserDefined.TryGetValue("action", out var actionObj))
{
var actionName = (string)actionObj;
}
在bool?
表达式后添加空检查(??
运算符):
var dictionary = watsonResponse.Context.Skills[MAIN_SKILL].UserDefined;
if (dictionary?.TryGetValue("action", out var actionObj)??false)
{
var actionName = (string)actionObj;
}
另一种选择是与 true
进行比较。
看起来有点奇怪,但它与三值逻辑一起工作并说:这个值是 true
但 不是 false
或 null
if (watsonResponse.Context.Skills[MAIN_SKILL]
.UserDefined?.TryGetValue("action", out var actionObj) == true)
{
var actionName = (string)actionObj;
}
你可以用!= true
做相反的逻辑:这个值是不是true
,所以要么false
要么null
if (watsonResponse.Context.Skills[MAIN_SKILL]
.UserDefined?.TryGetValue("action", out var actionObj) != true)
{
var actionName = (string)actionObj;
}
我正在尝试像往常一样在字典上使用 TryGetValue
,如下面的代码:
Response.Context.Skills[MAIN_SKILL].UserDefined.TryGetValue("action", out var actionObj)
我的问题是字典本身可能为空。我可以简单地使用一个“?”。在 UserDefined 之前,但随后我收到错误:
"cannot implicitly convert type 'bool?' to 'bool'"
处理这种情况的最佳方法是什么?在使用 TryGetValue 之前是否必须检查 UserDefined
是否为空?因为如果我不得不使用 Response.Context.Skills[MAIN_SKILL].UserDefined
两次,我的代码可能看起来有点乱:
if (watsonResponse.Context.Skills[MAIN_SKILL].UserDefined != null &&
watsonResponse.Context.Skills[MAIN_SKILL].UserDefined.TryGetValue("action", out var actionObj))
{
var actionName = (string)actionObj;
}
在bool?
表达式后添加空检查(??
运算符):
var dictionary = watsonResponse.Context.Skills[MAIN_SKILL].UserDefined;
if (dictionary?.TryGetValue("action", out var actionObj)??false)
{
var actionName = (string)actionObj;
}
另一种选择是与 true
进行比较。
看起来有点奇怪,但它与三值逻辑一起工作并说:这个值是 true
但 不是 false
或 null
if (watsonResponse.Context.Skills[MAIN_SKILL]
.UserDefined?.TryGetValue("action", out var actionObj) == true)
{
var actionName = (string)actionObj;
}
你可以用!= true
做相反的逻辑:这个值是不是true
,所以要么false
要么null
if (watsonResponse.Context.Skills[MAIN_SKILL]
.UserDefined?.TryGetValue("action", out var actionObj) != true)
{
var actionName = (string)actionObj;
}