Не могу найти причину этого исключения NullReferenceException - PullRequest
1 голос
/ 20 января 2011

У меня есть следующий метод:

internal static void removeMethodFromTag(byte p, Method method)
        {
            Console.WriteLine("Remove method " + method.getName() + " from the tag");
            List<Method> outList = new List<Method>();
            methodTaggings.TryGetValue(p, out outList);
            Console.WriteLine(outList.Count);
            outList.Remove(method);
            methodTaggings.Remove(p);
            methodTaggings.Add(p, outList);
        }

Это метод словаря Теги:

private static Dictionary<byte, List<Method>> methodTaggings = new Dictionary<byte, List<Method>>();

Теперь я всегда получаю NullReferenceException в строке

Console.WriteLine(outList.Count);

Но я не понимаю, почему?Даже если я не найду значение в словаре, список не должен быть нулевым?

Ответы [ 9 ]

3 голосов
/ 20 января 2011

Если это не так:

internal static void removeMethodFromTag(byte p, Method method)
        {
            Console.WriteLine("Remove method " + method.getName() + " from the tag");
            List<Method> outList = new List<Method>();
            if (methodTaggings.TryGetValue(p, out outList);
            {
              Console.WriteLine(outList.Count);
              outList.Remove(method);
              methodTaggings.Remove(p);
              methodTaggings.Add(p, outList);
           }
        }
2 голосов
/ 20 января 2011

Добавьте if в метод TryGetValue. Я думаю, что TryGetValue устанавливает переменную out в ноль, когда она терпит неудачу.

internal static void removeMethodFromTag(byte p, Method method)
        {
            Console.WriteLine("Remove method " + method.getName() + " from the tag");
            List<Method> outList = new List<Method>();
            if(methodTaggings.TryGetValue(p, out outList)) {
                Console.WriteLine(outList.Count);
                outList.Remove(method);
                methodTaggings.Remove(p);
                methodTaggings.Add(p, outList);
            }
        }
1 голос
/ 20 января 2011

С MSDN :

Если ключ не найден, то параметр value получает соответствующее значение по умолчанию для типа значения TValue; например, 0 (ноль) для целочисленных типов, false для логических типов и null для ссылочных типов.

И List<Method> является ссылочным типом, поэтому он вернет null.

Удачи!

1 голос
/ 20 января 2011

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

1 голос
/ 20 января 2011

Значение списка больше не будет, независимо от того, будет ли TryGetValue успешным или нет, даже если вы присвоили ему значение перед вызовом. Простой пример:

int num = 9;
int.TryParse("abc", out num);

Очевидно, что TryParse не удалось, а исходное значение 9 не будет сохранено.

1 голос
/ 20 января 2011

TryGetValue заменяет ваш outList значением по умолчанию null

1 голос
/ 20 января 2011

Нет необходимости выделять outList в вашем коде, так как вы передаете его TryGetValue() через его второй аргумент, который объявлен как out параметр .

Я предполагаю, что TryGetValue() присваивает null outList.

1 голос
/ 20 января 2011

Может быть инициализировано до null по алгоритму TryGetValue. out параметры всегда инициализируются в вызываемом методе. И вашему коду не нужна эта строка:

List<Method> outList = new List<Method>();

Если вы используете какой-то метод, для которого нужен параметр ref (не out), тогда он вам понадобится. Но здесь. См. http://www.c -sharpcorner.com / UploadFile / mahesh / Использование theoutParameter12232005041002AM / Использование theoutParameter.aspx для получения более подробной информации.

1 голос
/ 20 января 2011

Единственное подозрение, которое я вижу здесь, это строка:

methodTaggings.TryGetValue(p, out outList);

Может ли быть так, что methodTaggings.TryGetValue для параметра p на самом деле выставит List в null?

Поместите точку останова на эту строку, и я думаю, вы увидите, что после того, как вы переступите эту строку, outList будет null.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...