繁体   English   中英

错误:Daemon.Global的类型初始化器在c#中引发异常

[英]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.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM