我正在使用下面的类文件,其中声明了一些变量在整个应用程序中使用。
现在我在另一个类文件中使用该变量BlockLogOut
来使值为true。
我只是把它放在下面并在其中收到错误.. TypeInitializationException
Global.BlockLogOut = True;
奇怪的是,它工作好几个月了,我现在正在上面这行收到这个错误。当然我正在修改应用程序中的其他一些东西,但肯定不是这个类文件。 会出现什么问题?
内部异常:system.null引用异常,对象引用未设置为对象的实例
namespace Daemon
{
class Global
{
public static bool BlockLogOut = false;
}
}
答案 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() { }
方法中进行初始化。它实际上不会被初始化,直到使用它的方法被调用(是的,这也适用于构造函数和实例方法;只要它们不使用该特定字段)。
但与往常一样,您保证在您需要之前将字段初始化,并且此初始化最多只会发生一次。