【问题标题】:TypeInitializationException/ArgumentException when referencing initialized variable引用初始化变量时的 TypeInitializationException/ArgumentException
【发布时间】:2013-12-19 02:27:17
【问题描述】:

当我尝试引用另一个类中的静态变量时,我刚刚收到一个异常,该类也是静态初始化的。这以前有效,但由于某种原因它现在失败了。我所做的唯一更改是将 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 为空。

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

【问题讨论】:

  • 我找到了解决方案,当stackoverflow允许我这样做时,我会自己回答。还是谢谢大家!
  • 我已经编辑了你的标题。请参阅“Should questions include “tags” in their titles?”,其中的共识是“不,他们不应该”。

标签: c#-4.0 argumentexception


【解决方案1】:

我发现了我的错误,但我得到的异常非常具有误导性。这是与我引用的字典不同的字典的问题。它可能一开始没有被初始化,因为在那之前的一些事情失败了(如果有人可以解决这个问题,请随时这样做!)。基本上我做错的是使用双向字典并添加两次值。这通常会产生一个正常的异常,但由于它是静态完成的,它被包装到一个 TypeInitializationException 中。我对内部异常的确切堆栈跟踪进行了更深入的研究,并找到了异常的来源。也许这对将来的某人有帮助...

【讨论】:

    【解决方案2】:

    我遇到了一个类似的问题,遇到了同样的异常。发现我的实用程序类的静态构造函数正在生成异常。由于异常的描述具有误导性,因此需要一些时间来定位。

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

    【讨论】:

      猜你喜欢
      • 2017-05-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2019-05-17
      • 1970-01-01
      • 1970-01-01
      • 2016-05-28
      相关资源
      最近更新 更多