C# 为什么调试器会遇到默认情况?

C# 为什么调试器会遇到默认情况?,c#,debugging,switch-statement,C#,Debugging,Switch Statement,某位同事遇到了一个非常奇怪的调试问题,在这个问题中,他单步执行一个开关,单步执行某些情况,但之后它也会执行默认情况。我不知道这怎么会发生 它很容易复制,我最终将代码提取到一个小测试中 如果我只在默认情况下设置断点,那么调试器将永远不会停止。但是,如果我在案例42中添加一个断点,然后使用step over,它将在之后命中默认案例!! 不过,请注意,渔获量永远达不到。那么,调试器似乎显示了一些实际上没有发生的事情? 另外,如果我删除异步任务并等待,那么它就不会发生。。 我们还需要另一个声明变量的案例

某位同事遇到了一个非常奇怪的调试问题,在这个问题中,他单步执行一个开关,单步执行某些情况,但之后它也会执行默认情况。我不知道这怎么会发生

它很容易复制,我最终将代码提取到一个小测试中

如果我只在默认情况下设置断点,那么调试器将永远不会停止。但是,如果我在案例42中添加一个断点,然后使用step over,它将在之后命中默认案例!! 不过,请注意,渔获量永远达不到。那么,调试器似乎显示了一些实际上没有发生的事情? 另外,如果我删除异步任务并等待,那么它就不会发生。。 我们还需要另一个声明变量的案例(一些花哨的东西,而不是简单的整数等等)

由Sinatr创建的GIF,用于说明手头的主题,谢谢!
您使用的剂量测定法不正确。 ASYNC关键字意味着您在方法中的某个地方有一些wait调用(以便在任务结束后获取返回点),但您没有。 您奇怪的调试器行为与实现有关。您的异常不是由事实引发的。我已经复制了您的案例,MyException构造函数被调试器忽略/跳过,并且catch(Exception exc)部分中的代码也从未调用过。或者,如果我在案例42:中被打断,我只需按F5,那么默认部分中的断点将被跳过

public async Task DoSomething(int x)
        {
            try
            {
                switch (x)
                {
                    case 43:
                        var foo = new Foo();
                        break;
                    case 42:
                        Debug.WriteLine(x);
                        break;
                    case 44:
                        break;
                    default:
                        throw new MyException("aaarghh..");
                }
            }
            catch (Exception exc)
            {
                MessageBox.Show(exc.Message);
            }
        }

        private async void button1_Click(object sender, EventArgs e)
        {
            await DoSomething(42);
        }

        public class MyException : Exception
        {
            public MyException(string message): base(message)
            {
                if (message != null)
                    Debug.WriteLine(message);
            }

            public MyException() : base()
            {
            }

            public MyException(string message, Exception innerException) : base(message, innerException)
            {
            }
        }

您是作为调试版还是发布版编译的?
NotImplementedException
是否真的被抛出?看起来更像是调试器无法正确显示当前语句。您确定您的代码构建正确吗?也就是说,您可能正在调试一个旧的exe,并且代码自构建以来发生了更改?我相信这与以下事实有关:在调试模式下,switch语句被编译为if-else语句(而不是在发布模式下的跳转表)。因此,不要在休息后打最后一个卷发支撑;语句,它命中最后一行,这是默认的。啊,不,我复制了这个。只有当
DoSomething
方法是
async
时才会发生这种情况。我觉得调试器有点混乱。好吧,我可以在DoSomething中添加一个异步方法,但这与问题无关,不管你有没有行为正常的代码。在调试窗口中,您将只有“42”,但没有“aaarghh..”即使我
等待
内部
DoSomething
,我仍会复制此信息。是的,我认为这与调试器被为
async
方法生成的代码弄糊涂有关,但这与
wait
内部是否有
DoSomething
无关。你说“你使用的DoSomething方法不正确”——我认为“不正确”与此无关,我的观点是,我可以更新问题,并在其中添加一个等待的方法。那么,行为还是一样的,你的回答没有添加任何新的见解。我已经发现代码并没有实际执行。(请参见OP“看来调试器正在显示实际未发生的事情?”)
public async Task DoSomething(int x)
        {
            try
            {
                switch (x)
                {
                    case 43:
                        var foo = new Foo();
                        break;
                    case 42:
                        Debug.WriteLine(x);
                        break;
                    case 44:
                        break;
                    default:
                        throw new MyException("aaarghh..");
                }
            }
            catch (Exception exc)
            {
                MessageBox.Show(exc.Message);
            }
        }

        private async void button1_Click(object sender, EventArgs e)
        {
            await DoSomething(42);
        }

        public class MyException : Exception
        {
            public MyException(string message): base(message)
            {
                if (message != null)
                    Debug.WriteLine(message);
            }

            public MyException() : base()
            {
            }

            public MyException(string message, Exception innerException) : base(message, innerException)
            {
            }
        }