9

在我的代码中,我想使用在数据包中编码为一个符号的项目的文本名称。

在通常情况下,1012cat, dog, cat, frog对我来说很重要,但是像这样的对还有很多,所以很难记住所有这些。有时它们需要更改,所以我想我应该Dictionary<string, int>为此使用 a 。但是后来……</p>

switch (symbol)
{
    case "0": { /* ... */ }
    case "1": { /* ... */ }
    case "2": { /* ... */ }
    case "n": { /* ... */ }
}

……变成……</p>

switch (symbol)
{
    case kvpDic["cat"]: { /* ... */ }
    case kvpDic["dog"]: { /* ... */ }
    case kvpDic["frog"]: { /* ... */ }
    case kvpDic["something else"]: { /* ... */ }
}

工作室说我需要为我的开关使用常量。

我如何使它工作?

Upd:此类动物的数量及其值对仅在运行时才知道,因此代码不得使用常量(我猜)。

4

3 回答 3

19

您可以将Func<T>或存储Action在字典中。

var dict = new Dictionary<int, Action>();
dict.Add(1, () => doCatThing()); 
dict.Add(0, () => doDogThing());
dict.Add(2, () => doFrogThing());

然后,像这样使用它:

var action = dict[1];
action();
于 2012-05-11T18:13:40.043 回答
1

这不是 VS 限制,而是语言限制。因此,您将无法完全按照自己的意愿行事。一个想法是使用枚举。枚举不能为其条目使用 char 值,请查看Why we can't have "char" enum types以获取一些信息。

于 2012-05-11T18:13:54.483 回答
0

您想使用枚举,而不是字典。

enum AnimalsEnum { Dog, Cat, Bird, Fish };


public whathuh(AnimalsEnum whichAnimal) {
 switch(whichAnimal) {
   case AnimalsEnum.Dog:
   case AnimalsEnum.Cat:
...
}

}
于 2012-05-11T18:16:19.100 回答