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