为什么TryGetValue会释放我的词典?

时间:2011-12-10 12:39:28

标签: c# dictionary trygetvalue

我有这段代码:

Dictionary<string, object> tempDict = new Dictionary<string, object>();

if(xDicionary.TryGetValue(...., out tempDict)
{
tempDict.Add(...);
}
else
{
tempDict.Add(..);
}

如果代码传递给else块,那么我得到了无法执行add的异常,因为tempDict指向null。为什么会这样?我知道如何通过在else块中分配新的Dictionary来以一种丑陋的方式绕过它但是有没有更好的方法呢?

5 个答案:

答案 0 :(得分:3)

由于具有out参数的方法,必须out参数指定值。这意味着当您调用xDicionary.TryGetValue tempDict时总是被覆盖,并且当找不到任何内容时,它将被设置为null。因此,在您的其他地方,tempDict 始终 为空。

答案 1 :(得分:1)

这就是TryGetValue的工作原理,因为它使用out参数。 out参数始终在方法中赋值,因此无论您将参数初始化为什么,它都将被覆盖。

documentation通过陈述:

来说明这一点
  

此参数未初始化传递。

所以你必须使用临时的。

答案 2 :(得分:1)

TryGetValue将返回false,如果无法获取值,则将tempDict设置为null

这是因为在被调用的方法中必须明确指定out参数 ,并且当值无法重试时,null是要分配给它的逻辑默认

这是所有BCL TryGet*方法的正常语义。

答案 3 :(得分:0)

因为如果xDictionary不包含请求的值,TryGetValue会返回falseout值会设置为null。因此,当您尝试向Add null做某事时,您会获得NullReferenceException

答案 4 :(得分:0)

你应该在else {}块中放入tempDict = new ....如果TryGetValue返回false,则不能依赖out参数中的值。