以下代码在过去几个月中只抛出了几次NullReferenceException,但我不确定为什么。代码不是我的,但它对我来说非常直接。
Type pageType = page.GetType();
if (_pages.TryGetValue(pageType, out value))
return value;
// The following line throws the exception
return _pages[pageType] = new MyPage(_section.Pages[page]);
[NullReferenceException:Object 引用未设置为的实例 宾语。] System.Collections.Generic.Dictionary
2.Insert(TKey key, TValue value, Boolean add) +210 System.Collections.Generic.Dictionary
2.set_Item(TKEY的 关键,TValue值)+11
我唯一能想到的是pageType
在被用作字典键时为空,但显然是that is not possible。
调用它的代码很简单:
protected override void OnLoad(EventArgs e)
{
base.OnLoad(e);
_mypage = GetPage();
}
我还认为错误可能在_section.Pages
,但是section永远不会为null,并且永远不会设置任何内容。如果.Pages[page]
返回null,则MyPage
构造函数只返回。那我错过了什么?
答案 0 :(得分:2)
我遇到了这个问题,结果证明是线程相关的。
通过在插入字典的行周围放置同步锁,可以防止错误:
必须将其添加为类级别定义:
private static object _sync = new object();
这是由同步锁包围的插入语句:
lock (_sync)
{
return _pages[pageType] = new MyPage(_section.Pages[page]);
}
答案 1 :(得分:1)
我认为它会抛出一个异常,因为字典中没有关键 pageType 的元素,并且访问者返回null。
尝试
MyPage newPage = new MyPage(_section.Pages[page]);
_pages.Add(pageType, newPage);
return newPage;
或者如果您尝试重复使用该条目:
MyPage newPage = new MyPage(_section.Pages[page]);
if (_pages.ContainsKey(pageType))
_pages[pageType] = newPage;
else
_pages.Add(pageType, newPage);
答案 2 :(得分:1)
也许字典用户在其他地方定义了在某些情况下失败的自定义 IEqualityComparer 。检查代码创建字典的位置,以查看是否传递了自定义比较器。也许比较器也可以为null,但这意味着这段代码永远不会运行......
答案 3 :(得分:0)
为了清楚起见,我会将它们分开,然后看看发生了什么。
var section = _section.Pages[page];
var newPage = new MyPage(section);
_pages.Add(pageType,newPage);
return newPage;
答案 4 :(得分:0)
我认为_pages或pageType对象为null。另一个机会是_section object。
答案 5 :(得分:0)
由于TryGetValue没有失败,它看起来是由_section.Pages [page]引起的。由于异常来自Dictionary.Insert方法,很可能是由页面的相等/哈希代码实现引起的。是否有针对页面类型的IEqualityComparer或Equals / GetHashCode方法的自定义实现?如何创建这些词典?