2
 private Dictionary<Type, Bag<Event>> events = new Dictionary<Type, Bag<Event>>();

 internal Bag<T> GetEventList<T>() where T:class
 {
    Type type = typeof(T);
    Bag<Event> b;
    if (events.TryGetValue(type, out b))
    {
        return b as Bag<T>;
    }
    else {
        b = new Bag<T>() as Bag<Event>;
        events[type] = b;
        return b as Bag<T>;
    }
}

internal void AddEvent<T>(T ev) where T:class,Event
{
    Type type = typeof(T);
    Bag<Event> b;
    if (events.TryGetValue(type, out b))
    {
        b.Add(ev); // <= NullReferenceException, b is null
    }
    else {
        b = new Bag<T>() as Bag<Event>;
        events.Add(type, b);
        b.Add(ev);
    }
}

我总是在 AddEvent 中得到 NullReferenceException。事件字典仅在这两个函数中使用,我不知道为什么值为空......我没有在任何地方插入空值!

我在这里疯了...

4

3 回答 3

4

可能的罪魁祸首是这一行:

b = new Bag<T>() as Bag<Event>;

演员表as可能失败,这将分配nullb.

我的猜测是,您使用的子类Event作为.TBag<T>bnull

更新:根据下面的评论,问题确实是as演员。要解决问题,只需创建一个new Bag<Event>(),不需要强制转换。

于 2012-07-10T21:13:46.170 回答
0

NullReferenceExceptionBag<T>无法施放时被抛出Bag<Event>

如果您将签名更改为internal void AddEvent<T>(Event ev) where T : class异常将关闭

于 2012-07-10T21:23:03.230 回答
0

某处空值与键类型相关联。

单步调试器中的代码并在NullReferenceException抛出 之前检查字典的状态。

于 2012-07-10T21:13:47.800 回答