找不到这个NullReferenceException的原因

时间:2011-01-20 09:31:07

标签: c# .net wpf exception

我有以下方法:

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);
        }

这是dictionarry方法标签:

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

现在我总是在行中找到NullReferenceException

Console.WriteLine(outList.Count);

但我不明白为什么?即使我没有在字典中找到值,列表也不应该为空?

9 个答案:

答案 0 :(得分:3)

这不应该是:

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 :(得分:2)

在TryGetValue方法中添加if。我认为TryGetValue在失败时将out变量设置为null。

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 :(得分:1)

我能看到的唯一嫌疑人是这一行:

methodTaggings.TryGetValue(p, out outList);

参数methodTaggings.TryGetValue p实际上是否将outList设置为null可能是null吗?

在这一行上放置一个断点,我想你会看到在你跨过这一行之后,outList将是{{1}}。

答案 3 :(得分:1)

可以通过null的算法将其初始化为TryGetValueout参数始终初始化为调用的insed方法。 而且你的代码不需要这一行:

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

如果你使用一些需要ref(not out)参数的方法,那么你需要它。但是这里出来了。 有关详细信息,请参阅:http://www.c-sharpcorner.com/UploadFile/mahesh/UsingtheoutParameter12232005041002AM/UsingtheoutParameter.aspx

答案 4 :(得分:1)

您无需在代码中分配outList,因为您通过其第二个参数将其传递给TryGetValue(),该参数被声明为out parameter

我的猜测是TryGetValue()null分配给outList

答案 5 :(得分:1)

TryGetValue将outList替换为默认值 null

答案 6 :(得分:1)

除非TryGetValue成功与否,否则列表的值将不再存在,即使您在调用之前已为其指​​定了值。一个简单的例子:

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

TryParse显然失败,而原始值9将不会保留。

答案 7 :(得分:1)

您的错误是在您致电TryGetValue时。参数outList标记为out,因此您的原始空列表将丢失。

答案 8 :(得分:1)

来自MSDN

  

如果未找到密钥,则value参数将获取值类型TValue的相应默认值;例如,0(零)表示整数类型,false表示布尔类型,null表示引用类型。

List<Method>是一种引用类型,因此它会返回null

祝你好运!