考虑这段代码:
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
}
Run Code Online (Sandbox Code Playgroud)
以下是异常详细信息:
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:
Run Code Online (Sandbox Code Playgroud)
我无法弄清楚为什么我在运行时遇到此异常。我没有收到任何构建错误,并且代码看起来正确。
从你的堆栈跟踪来看,我认为你错过了有罪的代码。例如,也许它实际上看起来像这样:
public class CountEnum
{
public static readonly CountEnum DEFAULT = new CountEnum();
private static readonly List<CountEnum> AllInstances = new List<CountEnum>();
private CountEnum()
{
AllInstances.Add(this);
}
}
Run Code Online (Sandbox Code Playgroud)
这将按照堆栈跟踪显示的方式运行,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
Run Code Online (Sandbox Code Playgroud)
您应该查看第 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();
Run Code Online (Sandbox Code Playgroud)
这些变量将按照您指定的顺序进行初始化 - 因此对的调用将在具有非空值CountEnum("CA", "Canada")之前执行...并且当您尝试将其添加到 时,您将以完全正常的方式得到异常。OPTIONSOPTIONS
您只需将 的 声明移至顶部即可解决此问题:OPTIONS
private static readonly EnumDataTypeList OPTIONS = new EnumDataTypeList();
public static readonly CountEnum CANADA = new CountEnum("CA", "Canada");
public static readonly CountEnum DEFAULT = new CountEnum();
Run Code Online (Sandbox Code Playgroud)
这肯定可以工作,但这是一个相当脆弱的设计。我过去曾使用过这样的设计,但是当您需要特定的初始化顺序时,您可能会陷入麻烦。
| 归档时间: |
|
| 查看次数: |
32569 次 |
| 最近记录: |