【问题标题】:Can't use constants to define Dictionary keys? [duplicate]不能使用常量来定义字典键? [复制]
【发布时间】:2019-10-17 19:07:02
【问题描述】:

在处理嵌套字典时,我被警告说代码将无法编译,因为 “字典不包含 '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' 的定义”错误不断发生,而它在第二段代码中运行良好?有没有办法让它们按我的意图工作?

我还想指出,直接用它们的值替换这些常量是我不想做的事情,因为它们很容易在未来被修改。

当然,如果这是一个无法逾越的限制,我将不得不求助于第二段代码,尽管我发现它更脏而且有些难以理解。

谢谢。

【问题讨论】:

  • 这不是因为const,而是因为你的语法。写像Key = Value 这样的东西根本不是有效的c#代码。 myDict[key] = value 然而是。
  • 如果你想要类似于你的语法的东西,试试 C# 6 字典初始化语法:visualstudiomagazine.com/Blogs/Tool-Tracker/2015/04/…
  • 目前您的代码有 3 次尝试设置编译时间之后的编译时间常数。在其中 2 个中,您尝试将 int 常量设置为浮点值。在其中一个中,您尝试将 Dictonary 分配给 int 常量。所以那里没有任何东西对我来说几乎是有意义的。而且我知道六种编程语言。
  • 出于某种原因,我认为这就是将值分配给字典的工作原理。这只是一个语法问题,我按照@kristech 的回答修复了它。我最近开始使用字典,所以我不知道应该如何正确声明一个。

标签: c# dictionary constants


【解决方案1】:

下面是创建字典的正确语法,就像您正在尝试的那样:

            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 }
                    }
                }
            };

【讨论】:

  • 有趣,我以前从未见过这种语法......说实话,我最近开始使用字典,所以我不知道它的正确声明语法。谢谢你的回答!
猜你喜欢
  • 2019-03-18
  • 1970-01-01
  • 2019-03-30
  • 1970-01-01
  • 2016-05-17
  • 2014-03-20
  • 1970-01-01
  • 2018-05-08
  • 2013-03-26
相关资源
最近更新 更多