来自C#List.Find <t>的空引用异常

时间:2016-01-28 23:21:28

标签: c# closures nullreferenceexception

我在多线程环境中得到了来自此代码的空引用异常:

public static void GetLogger(string loggerName) {

    Logger logger = ListOfLoggers.Find(delegate(Logger newLogger) 
    { 
        return newLogger.Name.Contains(loggerName); 
    });

    if (logger == null) {
        ListOfLoggers.Add(new Logger(loggerName));
    }
}

在上面的代码中:

  • ListOfLoggers可以为空,但永远不会为null,因为它被初始化为静态只读变量。

  • 无法创建null Logger对象(将导致TypeInitializationException),因此ListOfLoggers永远不会包含null Logger对象。

  • 实例化Logger对象的唯一方法是提供一个设置为Logger对象的Name属性的参数,因此我也看不到newLogger.Name如何为null。 / p>

堆栈跟踪的断层线是:

LogManager.<>c__DisplayClass1.<GetLogger>b__0(Logger newLogger) 

并且似乎建议编译器生成的用于在委托闭包中保存newLogger局部变量的类是抛出空引用异常的类。

这似乎只发生在多线程环境中,并且在使用单个线程调用上面的代码时我从未看到空引用。这怎么可能?

0 个答案:

没有答案