Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/290.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 带值和不带值的枚举_C#_Enums_Switch Statement - Fatal编程技术网

C# 带值和不带值的枚举

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:

我有一个枚举和一个基于该枚举的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;
        }
其中输入是字符串。 我的问题是我有一个编译器错误

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也没有这种枚举整数古怪的魔力。我相应地更正了我的答案。