带有和不带值的枚举

时间:2016-11-30 15:06:54

标签: c# enums switch-statement

我有一个基于该枚举的枚举和switch语句,如下所示:

public enum MyEnum
    {
        VAL1,
        VAL2,
        VAL3,
        ONE = 1,
        TWO = 2
    }

和开关:

switch ((MyEnum)Enum.Parse(typeof(MyEnum), input.ToUpper()))
        {
            case MyEnum.VAL1:
                Console.WriteLine("val1");
                break;
            case MyEnum.VAL2:
                Console.WriteLine("val2");
                break;
            case MyEnum.VAL3:
                Console.WriteLine("val3");
                break;
            case MyEnum.ONE:
                Console.WriteLine("1");
                break;
            default:
                Console.WriteLine("default");
                break;
        }

其中input是一个字符串。 我遇到的问题是我有编译错误,

  

标签'case 1:'已经出现在switch语句

我发现在枚举中首先移动'ONE'元素可以解决问题,但我的问题是为什么会发生这种情况?

4 个答案:

答案 0 :(得分:6)

好吧,因为当你有:

时会发生什么
public enum MyEnum
    {
        VAL1,
        VAL2,
        VAL3,
        ONE = 1,
        TWO = 2
    }

你基本上有:

public enum MyEnum
    {
        VAL1 = 0,
        VAL2 = 1,
        VAL3 = 2,
        ONE = 1,
        TWO = 2
    }

你现在看到问题出在哪里了?您需要为它们分配不同的值。

答案 1 :(得分:1)

VAL2的值为1(因为它位于VAL1之后,其值为0)。这与您为ONE设置的值相同。

switch中的案例标签必须是不同的值:因此在您的情况下不正确,因此编译失败。

(如果你随机播放了ONE并且TWO处于开头,那么VAL2的值为4,问题就会消失,就像你一样观察)。

答案 2 :(得分:1)

C#中的枚举只是花哨的整数。如果没有显式声明枚举值的值,编译器会自动指定一个值。因此,当处理MyEnum.VAL2时,会为其分配值1,因为它是第二个值。然后MyEnum.ONE出现,并且也取值1。在交换机中,这会导致MyEnum.VAL2MyEnum.ONE都具有值1,并且由于交换机可能只包含一次值,因此会导致编译器错误。正如您已经想到的那样,只需将带有明确声明的值的枚举值移到顶部就可以解决问题,因为值1可以被视为“已采用”。

答案 3 :(得分:0)

如果我没有弄错,因为Val2将是1,因为它是第二个枚举,并且它们基于零,并且您已将另一个定义为“1”(一)。所以当你向上移动“One”时,它会改变顺序,因此问题就会消失。