为什么在C#中,在switch循环的default case后需要使用break?

5
在使用了default后,控制流应该自动退出switch loop。但是在C#中需要使用break语句?为什么在C#中控制流在default后没有自动退出switch loop
以下微软文档提到了这一点:https://learn.microsoft.com/en-us/dotnet/csharp/language-reference/keywords/switch 在我的代码中:
using System;

class Program {
static void Main() {
    Console.WriteLine("Enter a number between 1 and 10");
    int num;
    bool validity = int.TryParse(Console.ReadLine(), out num);
    if(validity==true) {
        switch(num) {
            case 1:
            case 2:
            case 3:
            case 4:
            case 5:
            case 6:
            case 7:
            case 8:
            case 9:
            case 10:

                Console.WriteLine("You have entered {0}", num);
                break;
            default:
                Console.WriteLine("You have not entered a number between 1 and 10");
                //break; This part is commented
        }
    } 
    else {
        Console.WriteLine("Please make a valid input");
    }
}
} 

我收到了这个错误信息 -

(23,5): error CS8070: 控制流不能从最后一个case标签('default:')中跳出

但是如果取消注释break部分,代码将正常工作。


6
C#语言规范禁止程序控制流程到达}之后的代码,这使得所有的case语句更加一致,容易进行重新排序。在此情况下,default语句排在最后只是巧合。 - Jon Skeet
请注意,break 不是实现此目的的唯一方法。throw new Exception(); 也会防止控制流到达 }。那么您就不需要使用 break - bornfromanegg
这与其他问题类似,但似乎有些不同。其他问题通常涉及最后一个情况,但这个问题特别涉及“default”。其他问题的答案主要涉及在最后一个标签上需要break语句通常可以帮助重构和一致性,如果最后一个标签不是“default”,这是正确的。他们似乎没有解释为什么语言中没有为“default”提供异常。 - Panzercrisis
1个回答

3
switch(num) {
    case 1:
        DoSomething();
    case 2:
        DoSomething2();
    case 3:
    case 4:
    case 5:
        Console.WriteLine("You have entered {0}", num);
        break;
    default:
        Console.WriteLine("You have not entered a number between 1 and 10");
        //break; This part is commented
    case 6:
        DoSomething3();
}

在上面的代码中,如果你只想要DoSomething()或者DoSomething()并且跳到2这个case吗?为了避免这样的错误(忘记了break),你可以在default块之后添加另一个case,然后你可能会忘记添加break。


C# 禁止 fall-through,除了空 case(例如这里的 3 和 4)。 - Damien_The_Unbeliever
1
这需要在case 1、case 2、default和case 6中加入break。我不确定这里想表达什么意思。 - bornfromanegg

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接