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

时间:2018-07-31 14:11:07

标签: c# if-statement switch-statement

我试图使用字符串的char索引创建一个switch语句,并使用this包装器创建一个Enum来从Description中获取所选枚举的值。它几乎可以让您将字符串存储为枚举值。

这是我的if声明:

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

这是我的switch声明:

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

为什么它接受if语句而不接受switch?我试图从字符串中选择一个索引,所以尝试将其转换为char,但是不幸的是它没有用。

更新:

这里是Message.Code枚举

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

如您所见,我需要分配给枚举的Description而不是为0的枚举值。使用上述包装器中的Message.Code.FOO_TRIGGER_SIGNAL.EnumDescriptionToString()返回A而不是0


错误:

  

期望一个恒定值

4 个答案:

答案 0 :(得分:53)

在C#7之前的情况下,不能有表达式,但是可以在开关中使用,因此可以使用:

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

您将需要在其中编写ConvertToMessageCodeMessage.Code枚举的转换。 ConvertToMessageCode只是抽象了转换细节,您可能会发现您不需要单独的方法,但是可以使用switch语句中的内联代码,例如强制转换。

答案 1 :(得分:27)

case语句中的switch必须引用一个常量值。您无法在case中计算表达式。

答案 2 :(得分:6)

这确实不是一个好答案,因为它只是对先前答案的详细说明。不接受(也请不要在任何合理的答案上投票)。我之所以将其写为答案,是因为评论不适合这种解释。


您尝试过:

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

这不起作用,因为大小写不恒定。如建议的那样,最好的方法是将msgComingFromFoo[1]字符串转换回枚举值,以便您可以切换枚举并在切换情况下使用枚举常量。

如果不可能,则可以随时切换字符串常量。但是,这很容易出错,并且一开始就无法使用枚举。

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

另一句话:记住数组是零索引的。您当前正在切换第二元素,而不是第一个。将msgComingFromFoo[0]用作第一个元素。

答案 3 :(得分:5)

要添加到@ code-apprentice的答案中。

如果您发现if语句变得太长或在if else内有多个条件。您可以查看代码重构并将逻辑封装到一个对象中,并使用访问者模式来控制要完成的工作。

类似的东西:

public interface IMessageLogic 
{
   void ProcessMessage()
}

public class TriggerSignal : IMessageLogic 
{
   public void ProcessMessage() 
   {
       // Do trigger stuff
   }
}

public class FooMessage : IMessageLogic 
{
   public void ProcessMessage() 
   {
       // Do foo stuff
   }
}

public class MessageHandler
{
    public void HandleMessage(IMessageLogic messageLogic)
    {
        messageLogic.ProcessMessage();
    }
}

public static void Main()
{
    IMessageLogic messageLogic = GetMessage();
    var handler = new MessageHandler();

    handler.HandleMessage(messageLogic);
 }

Visitor Pattern