1

我有这段代码:

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

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

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

4

5 回答 5

3

因为具有out参数的方法必须为参数赋值out。这意味着当你调用时xDicionary.TryGetValue tempDict总是被覆盖,而当什么都没有找到时,它被设置为空。因此,在您的 else 中,tempDict始终为空。

于 2011-12-10T12:43:05.377 回答
1

这就是TryGetValue工作原理,因为它使用了一个out参数。out参数总是在方法中分配一个值,因此无论您将参数初始化为什么,它都会被覆盖。

文档通过说明以下内容来说明这一点:

此参数未初始化传递。

所以你必须使用临时的。

于 2011-12-10T12:41:22.790 回答
1

TryGetValue如果无法获取值,将返回 false 并设置为tempDictnull

发生这种情况是因为必须在被调用的方法中明确分配out参数,并且当无法为值类型重试值时,分配给它的逻辑默认值是。null

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

于 2011-12-10T12:41:59.620 回答
0

因为如果xDictionary不包含请求的值,则TryGetValue返回false并将out值设置为null。因此,当您尝试对您Add做某事时,null您会得到NullReferenceException.

于 2011-12-10T12:42:09.277 回答
0

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

于 2011-12-10T12:44:11.823 回答