在空字典上尝试获取值

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 不是 falsenull

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;
}