提问者:小点点

为什么if语句有效而switch语句无效


我试图使用字符串和枚举的char索引创建语句,使用这个包装器从描述中获取所选枚举的值。它几乎允许您将字符串存储到枚举值中。

下面是我的语句:

if (msgComingFromFoo[1] == Convert.ToChar(Message.Code.FOO_TRIGGER_SIGNAL.EnumDescriptionToString()))
{
    //foo
}

下面是我的语句:

switch (msgComingFromFoo[1])
{
    case Convert.ToChar(Message.Code.FOO_TRIGGER_SIGNAL.EnumDescriptionToString()):
        break;
}

为什么它接受语句而不接受?我试着把它转换成一个char,因为我从一个字符串中选择了一个索引,但是不幸的是它没有工作。

更新:

下面是枚举

public class Message
{
    public enum Code
    {
        [Description("A")]
        FOO_TRIGGER_SIGNAL
    }
}

如您所见,我需要指定给枚举的描述,而不是枚举值0。使用上述包装器中的返回而不是

null


共3个答案

匿名用户

不能在case(在C#7之前)中使用表达式,但可以在switch中使用表达式,因此这将起作用:

switch (ConvertToMessageCode(msgComingFromFoo[1]))
{
    case Message.Code.FOO_TRIGGER_SIGNAL:
        break;
}

您将需要编写来进行到枚举的必要转换。只是抽象转换细节,您可能会发现不需要单独的方法,而是可以在switch语句中使用内联代码,例如强制转换。

匿名用户

语句中的必须引用常量值。不能计算中的表达式。

匿名用户

这实在不是一个好的答案,因为它只是对以前的答案的阐述。不要接受它(也请不要支持任何合理的答案)。我只是把它作为一个答案来写,因为一个评论不符合这个解释。

您尝试了:

switch (msgComingFromFoo[1])
{
    case Convert.ToChar(Message.Code.FOO_TRIGGER_SIGNAL.EnumDescriptionToString()):
        break;
}

这不起作用,因为情况不是恒定的。正如建议的那样,最好的方法是将字符串转换回一个枚举值,这样您就可以切换枚举并在切换情况下使用枚举常量。

如果这在某种程度上是不可能的,那么您总是可以切换字符串常量。但是,这很容易出错,并且破坏了首先使用枚举的目的。

switch (msgComingFromFoo[1])
{
    case "A":
        break;
}

另一个注意事项:记住数组是零索引的。您当前正在切换第二个元素,而不是第一个元素。对第一个元素使用