';的类型初始值设定项';引发了异常
本文关键字:异常 类型 | 更新日期: 2023-09-27 18:28:16
考虑以下代码:
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行——这就是抛出异常的原因。
编辑:好的,现在我们可以看到有问题的代码,它和我的猜测非常相似。看看这个代码:
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
具有非null值之前执行。。。当您尝试将其添加到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();
这是可以保证的,但这是一个相当脆弱的设计。我过去曾使用过类似的设计,但当您需要特定的初始化顺序时,可能会遇到麻烦。