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

为什么c#切换到另一种情况,c#,.net,visual-studio-2010,C#,.net,Visual Studio 2010,我有一个类似(a,b,c,d)的枚举 和一个方法来做一个开关上的枚举 public static string GetStatusMessage(BeatSession status, string custom_message="") { string msg = ""; try { switch (status) {

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

和一个方法来做一个开关上的枚举

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_结束)。 即使我通过了“on_ended”,它也会转到“on_Responsed”

我试着重新安排“公开枚举会议”。当我通过“on_ended”时,现在转到“on_accepted”

屏幕截图

注意观察会话状态变量。

如果enum实际上是一个enum,则案例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;
    }
}

我有一些代码,我可以这样做

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;}
           ...
        }
    }

也许你的代码是这样的:

 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,则在swith(认为您错过了“break;”)中,将转到BeatSession.on结束。

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

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

public static string GetStatusMessage(BeatSession status, string custom_message="")
{
...
}
在案例陈述中的下一件事是,您正在使用
enum.on\u answered
,这应该是
BeatSession.on\u 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语句应该有任何问题,请查看以下屏幕截图。
修复了该问题。这就是我所做的。我将枚举修改为这样

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
}
所以我认为发生的事情是在运行时或编译时的某个时刻,枚举get上的值被置乱了。所以我试着手动设置这个值,结果成功了



谢谢大家的回复。

请提供适当的代码供我们查看。就目前情况而言,您的示例缺少任何有用的东西供我们查看。如前所述,如果没有更多信息,它看起来应该可以工作。不过有一个想法是,您确定代码已经重新编译了吗?如果您的dll与源代码不匹配,则Visual Studio可能看起来像是进入了错误的行。在函数代码中,将
enum
替换为
BeatSession
,它应该work@ShenLance,如何确保switch语句的大小写不正确?您甚至无法编译当前代码。请将扩展讨论转移到,此线程变得相当长,并且接近噪音。当然,如果您要学究,变量引用
enum
也不会编译。然而,我无法想象这将如何帮助OP回答他的问题。@KirkWoll:发表一个工作代码示例来代替OP中一个有意义的示例是一种迂腐的行为?他所能做的就是展示一个最简单的例子,让OP将其与他的进行比较+1来计数器downvoteEnum被传递给我的函数,该函数上有switch(Enum e)语句。@EdS.--我没有进行downvote。但在回答你的问题时,我不明白这如何能帮助OP了解他的问题的性质。你愿意解释一下吗?(例如,在我看来,格雷格在评论中的建议很有可能,而这个答案对OP没有帮助)@EdS,更重要的是,我觉得OP还没有(尽管现在他已经)提供足够的信息来明智地回答这个问题。坦率地说,我不喜欢技术上正确但对提问者几乎没有帮助的(快速抽取)答案。这是因为如此强烈地公开带有未经验证的答案的问题和答案会阻碍工作流。如果你看一看,我的建议是函数的参数应该与枚举的类型相同,在这种情况下,使用枚举的类型而不仅仅是
enum
,虽然我同意OP没有提供SSCCE是令人沮丧的,但这个答案并不能解释为什么控制流会转到意外的案例标签。这个答案只解释了为什么代码不能如图所示编译。谢谢你的回复。我将编辑我的帖子以避免混淆。@ShenLance,你是否尝试过该代码,你能发布吗,你如何调用该方法?使用调试器并查看发生了什么on@KirkWoll,我不确定这是否是问题所在,我也不认为switch语句现在不起作用的任何原因。@ShenLance,不确定发生了什么,请检查编辑后的答案和屏幕截图为什么没有检查@saul672的答案。?抱歉,因为讨论已经很长时间了,我没有注意到他的回答。是的,我会检查一下。
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
}