引用初始化变量时的TypeInitializationException / ArgumentException

时间:2013-12-19 02:27:18

标签: c#-4.0 argumentexception

当我尝试在另一个类中引用静态变量时,我刚收到一个异常,这个静态变量也是静态初始化的。这之前有效,但由于某种原因它现在失败了。我做的唯一更改是将Visual Studio(2010)重置为默认设置,我无法想象这是其中的原因。我添加的任何其他代码也没有触及任何受影响的部分。

这是我的代码


WinForms类'MainForm':

partial class MainForm : Form
{ 
    // ...

    private RefClass convMan;
    private Dictionary<EnumType, string> LogNames = RefClass.LogNames;

    // ...

   public MainForm() { .... }
}

引用类'RefClass':

class RefClass
{
    // ...

    public enum EnumType { TypeOne = 0, TypeTwo = 1, TypeThree = 2 };

    public static Dictionary<EnumType, string> LogNames = new Dictionary<EnumType, string>()
    {
        { EnumType.TypeOne, "Text0" },
        { EnumType.TypeTwo, "Text1" },
        { EnumTypy.TypeThree, "Text2" }
    };

}

我现在得到的错误是(翻译自德语):

An unhandled exception of type "System.TypeInitializationException" occurred.

Additional information: The type initializer for "RefClass" threw an exception.

具有InnerException

System.ArgumentException

所以,就我而言,我的静态字典应该在被访问后初始化,因此当我的Form类引用它时。我尝试调试以查看静态字典是否在Form类中被引用之前被初始化,但事实并非如此。此外,当我在参考线的断点处停止时,变量LogNames为空。

我真的很困惑为什么会发生这种情况,之前一切都有效。

2 个答案:

答案 0 :(得分:1)

我发现了我的错误,但我得到的例外情况却相当误导。与我引用的字典不同,这是一个问题。它可能首先没有初始化,因为之前的事情失败了(如果有人可以清除它,请随意这样做!)。基本上我做错了是使用双向字典并添加两次值。这应该通常会产生一个正常的异常,但由于它是静态完成的,所以它被包装成TypeInitializationException。我深入研究了内部异常的确切堆栈跟踪,并找到了异常源自的位置。也许这有助于未来的某个人......

答案 1 :(得分:0)

我有一个类似的问题得到同样的例外。发现我的实用程序类的静态构造函数正在生成异常。花了一些时间来定位,因为异常的描述有误导性。

正如@Yeehaw所提到的,似乎异常被包装了,所以我要说的共同点是类/对象是静态的。