无法使用常量来定义字典键吗?

时间:2019-10-17 19:07:02

标签: c# dictionary const

在处理嵌套字典时,由于“字典不包含'CONST_NAME'的定义” ,我被警告该代码将无法编译。该字典是在同一类的静态构造函数上声明的,所以这不是问题。

简而言之,代码如下:

const int OBJECT_ID1 = 0;
const int OBJECT_ID2 = 1;
const int OBJECT_ID3 = 2;

(...)

static MyCLass()
{
   MyDictionary = new Dictionary<int, Dictionary<int, float>>
   {
      OBJECT_ID1 = new Dictionary<int, float>
      {
         OBJECT_ID2 = 5.0f,
         OBJECT_ID3 = 15.0f
      }
   };
}

public static readonly Dictionary<int, Dictionary<int, float>> MyDictionary;

所有三个常量都有此错误,所以不是因为嵌套字典(我认为)。

我很清楚我可以改用下面的代码(并且可以工作),但是,我想避免声明一个Dictionary变量,因为以后它不会用于其他任何事情(并且我相信原始代码更干净):

MyDictionary = new Dictionary<int, Dictionary<int, float>>();
Dictionary<int, float> dict = new Dictionary<int, float>();
dict.Add(OBJECT_ID2, 5.0f);
dict.Add(OBJECT_ID3, 15.0f);
MyDictionary.Add(OBJECT_ID1, dict);

所以,我的问题是:为什么“字典不包含'CONST_NAME'的定义”错误总是发生,而在第二段代码中却能正常工作呢?有没有办法让它们按我的预期工作?

我还想指出,我要避免直接用它们的值替换这些常量,因为它们将来很容易被修改。

当然,如果这是一个不可逾越的限制,我将不得不诉诸第二段代码,尽管我发现它更加肮脏且有些难以理解。

谢谢。

1 个答案:

答案 0 :(得分:0)

这里是正确的语法来创建类似于您尝试的字典的字典:

            const int OBJECT_ID1 = 0;
            const int OBJECT_ID2 = 1;
            const int OBJECT_ID3 = 2;

            Dictionary<int, Dictionary<int, float>> MyDict = new Dictionary<int, Dictionary<int, float>>()
            {
                {
                    OBJECT_ID1, new Dictionary<int, float>()
                    {
                        { OBJECT_ID2, 5.0f },
                        { OBJECT_ID3, 15.0f }
                    }
                }
            };