错误:Daemon.Global的Type Initializer在c#中引发了异常

时间:2010-05-20 03:12:02

标签: c#

我正在使用下面的类文件,其中声明了一些变量在整个应用程序中使用。 现在我在另一个类文件中使用该变量BlockLogOut来使值为true。

我只是把它放在下面并在其中收到错误.. TypeInitializationException

Global.BlockLogOut = True;

奇怪的是,它工作好几个月了,我现在正在上面这行收到这个错误。当然我正在修改应用程序中的其他一些东西,但肯定不是这个类文件。 会出现什么问题?

内部异常:system.null引用异常,对象引用未设置为对象的实例

   namespace Daemon
    {
        class Global
        {
            public static bool BlockLogOut = false;
        }
    }

4 个答案:

答案 0 :(得分:1)

此错误TypeInitializationException:作为类初始化程序抛出的异常的包装引发的异常。这个类不能被继承。

答案 1 :(得分:1)

我假设示例代码不是Global类中的完整代码。空引用异常表示您在静态构造函数中的某个位置使用了类实例;它与您在代码中包含的GlobalLock变量无关,因为它是值类型而不是类。

答案 2 :(得分:0)

我敢打赌你有一个静态构造函数:)如果是这样,那么异常实际上发生在静态构造函数中。

namespace Daemon
{
    using System;

    public class Global
    {
        public static bool BlockLogOut = false;

        static Global()
        {
            throw new Exception();
        }
    }
}

namespace ConsoleApplication
{
    public class Program
    {
        static void Main(string[] args)
        {
            Daemon.Global.BlockLogOut = true; // TypeInitializationException
        }
    }
}

答案 3 :(得分:0)

您最近是否已将目标框架更改为.NET 4.0?因为这可能是由于.NET 4.0中的类型初始化更改(Jon Skeet在他的博客上有一个post)。

长话短说,关于CLR如何以及何时初始化类型有一些变化。虽然它仍然符合规范,但它以 lazier 方式实现。同样,简而言之,它不会初始化字段,直到实际需要它们(虽然我不太确定这些变化的特性)。

确保您不依赖BlockLogOut在某种空Initialize() { }方法中进行初始化。它实际上不会被初始化,直到使用它的方法被调用(是的,这也适用于构造函数和实例方法;只要它们不使用该特定字段)。

但与往常一样,您保证在您需要之前将字段初始化,并且此初始化最多只会发生一次。