[英]Error : The Type Initializer of Daemon.Global threw an exception in c#
我正在使用下面的类文件,其中声明了一些变量以在整个应用程序中使用。 现在,我在另一个类文件中使用了该变量BlockLogOut
来使值变为true。
我只是将其放在行下方并在其中获取错误TypeInitializationException
Global.BlockLogOut = True;
奇怪的是,它已经工作了好几个月了,我现在在上面的行中遇到了这个错误。 当然,我正在修改应用程序中的其他内容,但肯定不是此类文件。 会是什么问题?
内部异常:system.null引用异常,对象引用未设置为对象的实例
namespace Daemon
{
class Global
{
public static bool BlockLogOut = false;
}
}
此错误TypeInitializationException :作为包装初始化器引发的异常的包装器引发的异常。 这个类不能被继承。
我假设示例代码不是您的Global类中的完整代码。 空引用异常表示您正在静态构造函数中某处使用类实例; 它与您包含在代码中的GlobalLock变量无关,因为它是值类型而不是类。
我打赌您有一个静态构造函数:)如果是这样,则该异常实际上发生在静态构造函数内部。
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
}
}
}
您最近是否将目标框架更改为.NET 4.0? 因为这可能是由于键入.NET 4.0初始化变化 (乔恩斯基特有一个帖子关于它在自己的博客)。
长话短说,CLR初始化类型和方式的方式已经有所改变。 尽管它仍然符合规范,但它以懒惰的方式进行。 再次概括地说,它不会初始化字段,直到它真正需要它们为止(尽管我不太确定这些更改的特殊性)。
确保您不依赖在某种空的Initialize() { }
方法中Initialize() { }
BlockLogOut
。 在使用它的方法被调用之前,它实际上不会初始化(是的,它也适用于构造函数和实例方法;只要它们不使用该特定字段)。
但是与往常一样,您可以确保在需要该字段之前对其进行初始化,并且该初始化最多会发生一次。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.