Как является этим Словарем <TKey, TValue> возможное исключение?

Учитывая следующее отслеживание стека:

MESSAGE: Value cannot be null.Parameter name: key  
SOURCE: mscorlib  
TARGETSITE: Void ThrowArgumentNullException(System.ExceptionArgument)  
STACKTRACE:  
   at System.ThrowHelper.ThrowArgumentNullException(ExceptionArgument argument)  
   at System.Collections.Generic.Dictionary'2.FindEntry(TKey key)  
   at System.Collections.Generic.Dictionary'2.get_Item(TKey key)  
   at MyCompany.MAF.Agent.ServiceContracts.ConvertUtils.Convert(Dictionary'2 from) in D:\Development\MAF\Agent\MyCompany.MAF.Agent\ServiceContracts\ConvertUtils.cs:line 11

Я прихожу к заключению, что так или иначе следующий блок кода получил пустой указатель от входного набора Ключей Словаря. Однако входной словарь является экземпляром Dictionary<string, string>. Реализация Dictionary<string, string> делает то условие невозможным. После добавления объекта с пустым ключом выдается исключение.

internal static KeyValuePair<string, string>[] Convert(IDictionary<string, string> from)
{
    List<KeyValuePair<string, string>> ret = new List<KeyValuePair<string, string>>();
    foreach (string key in from.Keys)
        ret.Add(new KeyValuePair<string, string>(key, from[key]));
    return ret.ToArray();
}
8
задан Jeroen 2 August 2016 в 20:43
поделиться

5 ответов

У меня эта проблема возникала часто, потому что я допускал ошибку, позволяя нескольким потокам обращаться к одному и тому же словарю. Убедитесь, что это не так, потому что Dictionary не является потокобезопасным.

(Кстати, ваш метод можно значительно упростить. Dictionary уже является IEnumerable>. Вы должны быть в состоянии просто выполнить ToArray для одного из них.

13
ответ дан 5 December 2019 в 07:11
поделиться

Похоже, что ваш аргумент IDictionary содержит элемент с параметром Key , который имеет значение NULL.

Проверка параметров для IDictionary , вероятно, будет происходить где-то внутри во фреймворке.

3
ответ дан 5 December 2019 в 07:11
поделиться

Structure101 предоставляет эту возможность как в графическом формате, так и в формате list/treeview . Это коммерческая, но не дорогая, и вы можете злоупотреблять пробной лицензией, если это быстрая работа.

-121--5044363-

Если вы находитесь на сервере на базе Debian (например, Ubuntu), вы можете выполнить следующую команду:

apt-get install php5-gd

После завершения выполнения:

/etc/init.d/apache2 restart

Это перезапустит ваш сервер и включит GD в PHP.

Если вы находитесь в системе другого типа, вам нужно будет использовать что-то другое (например, yum install) или компилировать непосредственно в PHP.

-121--1071983-

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

2
ответ дан 5 December 2019 в 07:11
поделиться

Не уверен насчет значения NULL, но почему вы не используете:

internal static KeyValuePair<string, string>[] Convert(IDictionary<string, string> from)
{
    return from.ToArray();
}

Изменить: Что касается значений NULL. У вас есть несколько потоков, обращающихся к этому IDictionary? Повреждение возможно, если вы не обеспечиваете потокобезопасность. См. Этот пост для примера коррупции в классе

Queue<T>

. Как я могу изменить коллекцию очередей в цикле?

2
ответ дан 5 December 2019 в 07:11
поделиться

Возможно ли, что другой поток влияет на директорию, передаваемую в Convert?

1
ответ дан 5 December 2019 в 07:11
поделиться
Другие вопросы по тегам:

Похожие вопросы: