为什么c#切换到另一种情况

时间:2012-08-17 02:49:26

标签: c# .net visual-studio-2010

我有一个类似(a,b,c,d)的枚举。

public enum BeatSession 
{
    on_ended,
    on_new,
    on_hold,
    on_paused,
    on_accepted,
    on_answered,
    on_timed_out,
    on_hanged_up,
    on_initiated,
    unknown
}

和一个切换枚举的方法。

public static string GetStatusMessage(BeatSession status, string custom_message="")
        {
            string msg = "";
            try
            {
                switch (status)
                {
                    case BeatSession.on_answered:
                        // msg will be here
                        break;
                    case BeatSession.on_ended:
                        // msg will be here
                        break;
                    case BeatSession .on_hanged_up:
                        // msg will be here
                        break;
                    case BeatSession.on_hold:
                        // msg will be here
                        break;
                    case BeatSession.on_new:
                        break;
                    case BeatSession.on_paused:
                        // msg will be here
                        break;
                    case BeatSession.on_timed_out:
                        // msg will be here
                        break;
                    case BeatSession.on_accepted:
                        // msg will be here
                        break;
                    default:
                        msg = "Unknown";
                        break;
                }

            }
            catch (Exception ex)
            {

                throw ex;
            }
            // Override message
            if (!String.IsNullOrEmpty(custom_message))
            {
                msg = custom_message;
            }

            return msg;
        }

更新

但是,每次我调用我的方法GetStatusMessage(BeatSession.on_ended)。 即使我通过“on_ended”,也会转到“on_answered”。

我尝试重新安排“public enum BeatSession”。当我通过“on_ended”时,它现在转到“on_accepted”。

截图

请注意session_status的监视器是否可变。 enter image description here

5 个答案:

答案 0 :(得分:1)

我有一些代码,我会做这样的事情

public enum Letters
    {
        A = 1,
        B = 2,
        ...
    }

public void someFunction(int value)
    {
      switch(value)
        {
           case (int)Letters.A: {/* Code */ break;}
           case (int)Letters.B: {/* Code */ break;}
           ...
        }
    }

它有效,但我认为你要做的是发送枚举并在交换机的开关中使用它,也许这样的东西可以工作

public void someFunction(Letters l)
    {
      switch(l)
        {
           case Letters.A: {/* Code */ break;}
           case Letters.B: {/* Code */ break;}
           ...
        }
    }

答案 1 :(得分:1)

您当前的代码不应该编译,以下是主要问题。

首先,方法定义包含参数enum status,你不能这样做,看来你需要一个BeatSession类型的参数,你应该将函数修改为:

public static string GetStatusMessage(BeatSession status, string custom_message="")
{
...
}

您的案例陈述中的下一件事是,您使用enum.on_answered,这应该是BeatSession.on_answered。所以你的完整功能应该是:

 public static string GetStatusMessage(BeatSession status, string custom_message = "")
        {
            string msg = "";
            try
            {
                switch (status)
                {
                    case BeatSession.on_answered:
                        // msg will be here
                        break;
                    case BeatSession.on_ended:
                        // msg will be here
                        break;
                    case BeatSession.on_hanged_up:
                        // msg will be here
                        break;
                    case BeatSession.on_hold:
                        // msg will be here
                        break;
                    case BeatSession.on_new:
                        break;
                    case BeatSession.on_paused:
                        // msg will be here
                        break;
                    case BeatSession.on_timed_out:
                        // msg will be here
                        break;
                    case BeatSession.on_accepted:
                        // msg will be here
                        break;
                    default:
                        msg = "Unknown";
                        break;
                }

            }
            catch (Exception ex)
            {

                throw ex;
            }
            // Override message
            if (!String.IsNullOrEmpty(custom_message))
            {
                msg = custom_message;
            }

            return msg;
        }

编辑:由于您使用答案代码编辑了问题,因此您的switch语句应该有任何问题,请查看以下屏幕截图。 enter image description here

答案 2 :(得分:0)

如果枚举实际上是一个枚举案例:a:不会传递编译。

这对我有用

enum myEnum {A, B, C};

public MainWindow()
{
    InitializeComponent();

    myEnum thisEnum = myEnum.B;

    switch(thisEnum)
    {
      case myEnum.A:
        // do something
        break;
      case myEnum.B:
       // do something
        break;
      default:
        break;
    }
}

答案 3 :(得分:0)

修正了问题。这就是我做的。我修改了我的Enum就是这样。

public enum BeatSession 
{
    on_ended=0,
    on_new=1,
    on_hold=2,
    on_paused=3,
    on_accepted=4,
    on_answered=5,
    on_timed_out=6,
    on_hanged_up=7,
    on_initiated=8,
    unknown=9
}

所以我认为发生的事情是在运行时或编译时的某个时刻,我的Enum上的值被扰乱了。所以我尝试手动设置值,这就是诀窍。

感谢大家的回复。

答案 4 :(得分:-1)

也许你的代码就像:

 public static string GetStatusMessage(BeatSession status, string custom_message = "")
    {
        string msg = "";
        try
        {
            switch (status)
            {
                case BeatSession.on_answered:
                    // msg will be here

                case BeatSession.on_ended:
                    // msg will be here
                    break;
 .....

如果你传递BeatSession.on_answered然后在swith(想想你错过了“break;”)去了BeatSession.on_ended。