C# 带值和不带值的枚举
我有一个枚举和一个基于该枚举的switch语句,如下所示:C# 带值和不带值的枚举,c#,enums,switch-statement,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:
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;
}
其中输入是字符串。
我的问题是我有一个编译器错误
switch语句中已出现标签“case1:”
我发现,在枚举中将“ONE”元素作为第一个元素移动可以解决这个问题,但我的问题是为什么会发生这种情况?
VAL2
将具有值1
(因为它正好放在VAL1
之后,该值取0
)。这与您为ONE
设置的值相同
开关
中的大小写标签必须是不同的值:因此在您的情况下不是这样,因此编译失败
(如果你在开始的时候把事情混在一起,那么
1
和2
,那么VAL2
的值将为4
,问题就会消失,正如你所观察到的那样)。因为发生的是当你有:
public enum MyEnum
{
VAL1,
VAL2,
VAL3,
ONE = 1,
TWO = 2
}
你基本上有:
public enum MyEnum
{
VAL1 = 0,
VAL2 = 1,
VAL3 = 2,
ONE = 1,
TWO = 2
}
你现在知道你的问题在哪里了吗?您需要为它们分配不同的值。如果我没有弄错的话,因为Val2将是1,因为它是第二个枚举,它们是基于零的,并且您已经将另一个定义为“1”(one)。因此,当你向上移动“1”时,它会改变序列,因此问题就消失了。C#中的枚举只是一个奇特的整数。如果未明确说明枚举值的值,编译器会自动分配一个枚举值。因此,当处理
MyEnum.VAL2
时,会将值1
指定为第二个值。然后MyEnum.ONE
出现,同时也接受值1
。在开关中,这会导致MyEnum.VAL2
和MyEnum.ONE
都具有值1
,并且由于开关只能包含一个值一次,这会导致编译器错误。正如您已经了解到的,只需将带有明确说明的值的枚举值移到顶部即可解决问题,因为值1
可以被视为“take”。创建新枚举时,其选项实际上是数字。如果未为枚举选项定义特定的数值,编译器将默认按升序(0,1,2,…)进行设置。这就是为什么VAL1=0、VAL2=1和VAL3=2。然后将值设置为1=1和2=2,因此必须为同一选项指定不同的名称(VAL2=1=1和VAL3=2=2)。
一个简单的控制台应用程序演示了这一点:
VAL2
和ONE
是一样的当你在调试器中运行它时,Val1,VAL2和Val3的整数值是多少?@MartinVerjans显然OP不能在调试器中运行它,因为它根本不会编译。我相信它实际上从0开始为Val1。见其他answers@DavidBenKnoble我相信你是对的,已经几个月没有使用C了,Java也没有这种枚举整数古怪的魔力。我相应地更正了我的答案。