【问题标题】:Static dictionary call "System.TypeInitializationException"静态字典调用“System.TypeInitializationException”
【发布时间】:2014-12-25 17:48:33
【问题描述】:

我有一个静态类来保存字典和 2 个 get 方法来访问它

这是我的课:


public static class ConfiguraCuadros
    {    
    public static Dictionary<string,Dictionary<string,Dictionary<string,Dictionary<string,string>>>> GetDictionary()
       {
           // Try to get the result in the static Dictionary
           return _configcuadros;
       }

       public static Dictionary<string, Dictionary<string, Dictionary<string, string>>> GetHoja(string key)
       {
           // Try to get the result in the static Dictionary
           Dictionary<string, Dictionary<string, Dictionary<string, string>>> result = new Dictionary<string, Dictionary<string, Dictionary<string, string>>>();
           if (_configcuadros.TryGetValue(key, out result))
           {
               return result;
           }
           else
           {
               return null;
           }
       }

    public static readonly Dictionary<string, Dictionary<string, Dictionary<string, Dictionary<string, string>>>> _configcuadros = new Dictionary<string, Dictionary<string, Dictionary<string, Dictionary<string, string>>>> 
    {

     {   "Formato01",   //this is just a hint, the dictionary is much more extensive
                new Dictionary<string, Dictionary<string, Dictionary<string, string>>> 
                {
                    {
                        "F01C01A",      
                        new Dictionary<string, Dictionary<string, string>> 
                        {
                            {
                                "X",
                                new Dictionary<string, string>
                                {
                                    { "key1" , "value1" },
                                    { "key2" , "value2" },
                                    { "key3" , "value3" },
                                }
                            },
                        }
                    },

                }

            },
        }
    }`

当我使用getter方法时,

ConfiguraCuadros.GetDictionary();

抛出异常:

mscorlib.dll 中出现了“System.ArgumentException”类型的第一次机会异常 “ConfiguraCuadros.GetDictionary()”引发了“System.TypeInitializationException”类型的异常 base: {"'beDGRAIC.ConfiguraCuadros' 的类型初始化器抛出异常。"} 类型名称:“beDGRAIC.ConfiguraCuadros”

'ConfiguraCuadros.GetHoja("Formato01")' 引发了类型为 'System.TypeInitializationException' 的异常 base: {"'beDGRAIC.ConfiguraCuadros' 的类型初始化器抛出异常。"} 类型名称:“beDGRAIC.ConfiguraCuadros”

如您所见,我的意图是拥有一个静态字典。我认为问题出在字典声明中……但我看不到在哪里……

以防万一,“beDGRAIC”是我的命名空间。

感谢您的帮助!

【问题讨论】:

  • 读取内部异常。
  • 你能不能用Tuple代替多层嵌套的Dictionary
  • 你是认真的Dictionary&lt;string,Dictionary&lt;string,Dictionary&lt;string,Dictionary&lt;string,string&gt;&gt;&gt;&gt; 吗?在修复 TypeInitializationException 之前,请考虑一个好的数据结构。

标签: c# .net dictionary static-classes static-class


【解决方案1】:

您的代码(几乎)和我一样工作。

我只是添加了一个缺少的分号来编译它,然后可以毫无例外地调用ConfiguraCuadros.GetDictionary();

这是缺少分号的代码:

public static class ConfiguraCuadros
{
    public static Dictionary<string, Dictionary<string, Dictionary<string, Dictionary<string, string>>>> GetDictionary()
    {
        // Try to get the result in the static Dictionary
        return _configcuadros;
    }

    public static Dictionary<string, Dictionary<string, Dictionary<string, string>>> GetHoja(string key)
    {
        // Try to get the result in the static Dictionary
        Dictionary<string, Dictionary<string, Dictionary<string, string>>> result = new Dictionary<string, Dictionary<string, Dictionary<string, string>>>();
        if (_configcuadros.TryGetValue(key, out result))
        {
            return result;
        }
        else
        {
            return null;
        }
    }

    public static readonly Dictionary<string, Dictionary<string, Dictionary<string, Dictionary<string, string>>>> _configcuadros = new Dictionary<string, Dictionary<string, Dictionary<string, Dictionary<string, string>>>> 
        {
            {   "Formato01",   //this is just a hint, the dictionary is much more extensive
                new Dictionary<string, Dictionary<string, Dictionary<string, string>>> 
                    {
                        {
                            "F01C01A",      
                            new Dictionary<string, Dictionary<string, string>> 
                            {
                                {
                                    "X",
                                    new Dictionary<string, string>
                                    {
                                        { "key1" , "value1" },
                                        { "key2" , "value2" },
                                        { "key3" , "value3" },
                                    }
                                },
                            }
                        }
                     }
              }
        };
}

[更新]

我同意上面的 cmets 关于检查 InnerException 作为类型初始化异常的一般规则,特别是关于数据类型的不友好性质!

【讨论】:

  • 我在读取确切的内部异常时遇到问题,因为该调用在一个方法中,并且只有被调用的方法在一个 try-catch 括号中,是的,答案在内部异常中。跨度>
  • 现在我在一本字典{ "TXT", "(3/) ""A""." }, 中有一个双引号字符串的奇怪问题,编译器强调"A"".",我不知道为什么......(它说'}预期')
  • 编译器(或我!)不清楚你的字符串是什么。如果将它们包含在字符串文字中,则需要转义 " 字符。
  • 我试图逃避它们,原来的字符串是:(3/) "A". 但我的方法似乎有一些我看不到的错误
猜你喜欢
  • 2020-03-30
  • 1970-01-01
  • 1970-01-01
  • 2012-09-16
  • 2012-11-13
  • 1970-01-01
  • 1970-01-01
  • 2011-10-18
  • 2012-10-11
相关资源
最近更新 更多