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 を取得します。イベント ディクショナリはこれら 2 つの関数でのみ使用されます。値が null である理由がわかりません... どこにも null 値を挿入していません!

ここで発狂します...

4

3 に答える 3

4

考えられる原因は次の行です。

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

asキャストはおそらく失敗しており、に割り当てられnullますb

私の推測では、 のサブクラスをEventの型として使用しており、型パラメーターで共変ではないTため(クラスであると想定しているBag<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 に答える