繁体   English   中英

''的类型初始值设定项引发了异常

[英]The type initializer for '' threw an exception

考虑以下代码:

public class CountEnum : EnumDataType
    {
        public static readonly CountEnum CANADA = new CountEnum("CA", "Canada");
        public static readonly CountEnum DEFAULT = new CountEnum();
        private static readonly EnumDataTypeList OPTIONS = new EnumDataTypeList();
        public static readonly CountEnum UNITED_STATES = new CountEnum("US", "United States");
        public static readonly CountEnum UNSET = new CountEnum();


        private CountEnum()
        {
        }

        private CountEnum(string code, string name)
        {
            base.code = code;
            base.name = name;
            OPTIONS.Add(this); // This is the line 23
        }

以下是例外情况:

System.TypeInitializationException was caught
  Message=The type initializer for 'CP.BusinessLogic.VConfig' threw an exception.
  Source=CP.BusinessLogic
  TypeName=CP.BusinessLogic.VConfig
  StackTrace:
       at CP.BusinessLogic.VConfig.get_Instance()
       at CP.Fac.CPFac.GetActs() in C:\tfs_src\TeamProject\Main\Source\DApp\CPApp\Fac\CPFac.cs:line 170
  InnerException: System.TypeInitializationException
       Message=The type initializer for 'CP.Types.CountEnum' threw an exception.
       Source=CP.BusinessLogic
       TypeName=CP.Types.CountEnum
       StackTrace:
            at CP.BusinessLogic.VConfig..ctor() in C:\tfs_src\TeamProject\Main\Source\DApp\CPApp\BusinessLogic\VConfig.cs:line 14
            at CP.BusinessLogic.VConfig..cctor() in C:\tfs_src\TeamProject\Main\Source\DApp\CPApp\BusinessLogic\VConfig.cs:line 11
       InnerException: System.NullReferenceException
            Message=Object reference not set to an instance of an object.
            Source=CP.DataObject
            StackTrace:
                 at CP.Types.CountEnum..ctor(String code, String name) in C:\tfs_src\TeamProject\Main\Source\DApp\CPApp\Types\CountEnum.cs:line 23
                 at CP.Types.CountEnum..cctor() in C:\tfs_src\TeamProject\Main\Source\DApp\CPApp\Types\CountEnum.cs:line 8
            InnerException:

我无法弄清楚为什么我在运行时得到这个异常。 我没有得到任何构建错误,代码看起来正确。

根据您的堆栈跟踪判断,我认为您错过了有罪的代码。 例如,也许它实际上是这样的:

public class CountEnum
{
   public static readonly CountEnum DEFAULT = new CountEnum();
   private static readonly List<CountEnum> AllInstances = new List<CountEnum>();

   private CountEnum()
   {
       AllInstances.Add(this);
   }
}

这将表示堆栈跟踪显示的方式, CountEnum构造函数抛出NullReferenceException 但是,我们无法确定,因为您没有包含CountEnum构造函数的主体(或者根本没有为CountEnum发布有效代码)。

从根本上说,这是你应该看到的堆栈跟踪的一点:

InnerException: System.NullReferenceException
     Message=Object reference not set to an instance of an object.
     Source=CP.DataObject
     StackTrace:
          at CP.Types.CountEnum..ctor(String code, String name) in C:\...\CountEnum.cs:line 23
          at CP.Types.CountEnum..cctor() in C:\...\CountEnum.cs:line 8

您应该查看CountEnum.cs第23 CountEnum.cs - 这就是抛出异常的原因。

编辑:好的,现在我们可以看到有问题的代码,它与我的猜测非常相似。 看看这段代码:

public static readonly CountEnum CANADA = new CountEnum("CA", "Canada");
public static readonly CountEnum DEFAULT = new CountEnum();
private static readonly EnumDataTypeList OPTIONS = new EnumDataTypeList();

这些变量将按照您指定的顺序进行初始化 - 因此,对于CountEnum("CA", "Canada")调用将在OPTIONS具有非空值之前执行...当您尝试将其添加到OPTIONS ,你会以完全正常的方式得到一个例外。

可以通过将OPTIONS的声明移到顶部解决这个问题:

private static readonly EnumDataTypeList OPTIONS = new EnumDataTypeList();
public static readonly CountEnum CANADA = new CountEnum("CA", "Canada");
public static readonly CountEnum DEFAULT = new CountEnum();

这保证可行,但它是一个相当脆弱的设计。 过去曾经使用过这样的设计,但是当你需要特定的初始化命令时,你可能会陷入困境。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

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