Почему TryGetValue освобождает мой словарь? - PullRequest
1 голос
/ 10 декабря 2011

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

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

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

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

Ответы [ 5 ]

3 голосов
/ 10 декабря 2011

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

1 голос
/ 10 декабря 2011

TryGetValue вернет false и установит tempDict в null, если не удалось получить значение.

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

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

1 голос
/ 10 декабря 2011

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

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

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

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

0 голосов
/ 10 декабря 2011

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

0 голосов
/ 10 декабря 2011

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

...