我有这段代码:
Dictionary<string, object> tempDict = new Dictionary<string, object>();
if(xDicionary.TryGetValue(...., out tempDict)
{
tempDict.Add(...);
}
else
{
tempDict.Add(..);
}
如果代码传递给else块,那么我得到了无法执行add的异常,因为tempDict指向null。为什么会这样?我知道如何通过在else块中分配新的Dictionary来以一种丑陋的方式绕过它但是有没有更好的方法呢?
答案 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
会返回false
,out
值会设置为null
。因此,当您尝试向Add
null
做某事时,您会获得NullReferenceException
。
答案 4 :(得分:0)
你应该在else {}块中放入tempDict = new ....如果TryGetValue返回false,则不能依赖out参数中的值。