Почему TryGetValue освобождает мой словарь?

У меня есть этот кусок кода:

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

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

Если код переходит к блоку else, я получаю исключение, которое не может выполнить добавление, поскольку tempDict указывает на ноль. Почему это происходит? Я знаю, как безобразно обойти это, выделяя новый словарь также в блоке else, но есть ли лучший способ сделать это?

5 ответов

Решение

Потому что методы, которые имеют out параметр, должен присвоить значение out параметр. Это означает, что когда вы звоните xDicionary.TryGetValuetempDict всегда перезаписывается, а когда ничего не найдено, устанавливается значение NULL. Поэтому в вашем другом, tempDict всегда будет нулевым.

Вот как TryGetValue работает, потому что он использует out параметр. out Параметру всегда присваивается значение в методе, поэтому независимо от того, к какому параметру вы инициализируете, он будет перезаписан.

Документация подтверждает это:

Этот параметр передается неинициализированным.

Таким образом, вы должны использовать временный.

TryGetValue вернет false и установит tempDict в null если бы не смог получить значение.

Это происходит потому, что out параметр должен быть определенно назначен в вызываемом методе, и когда значение не может быть повторено для типа значения, null логическое значение по умолчанию для него.

Это нормальная семантика всех BCL TryGet* методы.

Вы должны поместить tempDict = new ... в блок else {}. Если TryGetValue возвращает false, вы не можете полагаться на значение в параметре out.

Потому что, если xDictionary не содержит запрашиваемое значение, TryGetValue возвращается false и out значение установлено в null, Следовательно, когда вы пытаетесь сделать Add что-то null ты получаешь NullReferenceException,

Другие вопросы по тегам