我有一个基于该枚举的枚举和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'元素可以解决问题,但我的问题是为什么会发生这种情况?
答案 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.VAL2
和MyEnum.ONE
都具有值1
,并且由于交换机可能只包含一次值,因此会导致编译器错误。正如您已经想到的那样,只需将带有明确声明的值的枚举值移到顶部就可以解决问题,因为值1
可以被视为“已采用”。
答案 3 :(得分:0)
如果我没有弄错,因为Val2将是1,因为它是第二个枚举,并且它们基于零,并且您已将另一个定义为“1”(一)。所以当你向上移动“One”时,它会改变顺序,因此问题就会消失。