在switch-case中使用枚举值的字符串表示

为什么在交换机情况下不能将枚举值用作字符串? (或者这有什么问题:)

String argument; switch (argument) { case MyEnum.VALUE1.toString(): // Isn't this equal to "VALUE1" ? // something break; case MyEnum.VALUE2.toString(): // something else break; 

您只能使用编译时已知的字符串。 编译器无法确定该表达式的结果。

也许你可以试试

 String argument = ... switch(MyEnum.valueOf(argument)) { case VALUE1: case VALUE2: 

case MyEnum.VALUE1.toString()://这不等于“VALUE1”吗?

不,不一定:您可以自由提供自己的toString()

 public enum MyType { VALUE1 { public String toString() { return "this is my value one"; } }, VALUE2 { public String toString() { return "this is my value two"; } } 

}

此外,维护代码的人可以在您离开公司后添加此实现。 这就是为什么你不应该依赖String值,而是坚持使用你的enum的数值(由常量MyEnum.VALUE1MyEnum.VALUE2等表示)。

为了增加Peter Lawrey的评论,请看看去年的这篇文章, 该文章讨论了JDK7之前和之后的Java中的字符串切换。

编辑 :为Java问题的C#答案道歉。 我不知道那里出了什么问题。

可以使用字符串值(包括枚举的字符串值)。 但是,您可能只使用编译时常量 。 您正在调用一个方法ToString() ,该方法需要在运行时进行评估。

从C#6开始,您可以使用此常量替代方法: case nameof(SomeEnum.SomeValue):

Nameof()在编译时被评估,只是与给定变量,类型或成员的(非限定)名称匹配的字符串。 它的值与SomeEnum.ToString()值相匹配。