我有以下方法:
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);
但我不明白为什么?即使我没有在字典中找到值,列表也不应该为空?
答案 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
的算法将其初始化为TryGetValue
。 out
参数始终初始化为调用的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
。