C# 在开关情况下,如果我们写;“违约”;与任何单词或单个字母一样,它不会抛出错误

C# 在开关情况下,如果我们写;“违约”;与任何单词或单个字母一样,它不会抛出错误,c#,switch-statement,C#,Switch Statement,在开关中,如果我们写任何单词或单个字母而不是默认值,它不会抛出错误。 e、 g 它运行时不会抛出错误 有人能解释一下它是如何工作的吗?它是编译的,因为你好:是一个标签,因此可以作为转到的目的地。当我编译这篇文章时,我收到了关于未引用标签的警告(因为我没有goto) 下面是一个可以在LINQPad中使用的示例—您会注意到它同时打印“1”和“hello”: 它与开关语句无关。它是的标签标识符(由于实践不好,很少使用) 对于您的示例,您可以看到以下代码段: switch (10) { case

开关中
,如果我们写任何单词或单个字母而不是
默认值
,它不会抛出错误。 e、 g

它运行时不会抛出错误


有人能解释一下它是如何工作的吗?

它是编译的,因为
你好:
是一个标签,因此可以作为
转到的目的地。当我编译这篇文章时,我收到了关于未引用标签的警告(因为我没有goto)

下面是一个可以在LINQPad中使用的示例—您会注意到它同时打印“1”和“hello”:


它与
开关
语句无关。它是的标签标识符(由于实践不好,很少使用)


对于您的示例,您可以看到以下代码段:

switch (10)
{
    case 1:
        break;

    hello:
        Console.Write("In hello label");
        break;
    case 2:
        goto hello;
        break;
}
在上面,您正在switch语句中为goto语句定义一个标签。如果switch语句落在
情况2
,则它将转到标签
hello
。因为您的原始代码段没有
转到hello您将收到未引用标签的警告


您的标签
hello
与switch语句没有任何关系(内部定义的除外)

让我想起一个老笑话/把戏:C风格的语言理解URL!您只需粘贴
http://www.google.com/
在自己的线路上的任何位置=P
switch(1)
{
    case 1:
        "1".Dump();
        goto hello;
    break;

    hello:
        "hello".Dump();
        break;
}
goto something2;
something1:
    Console.WriteLine("world");
    goto done;
something2:
    Console.WriteLine("hello");
goto something1;
done:
switch (10)
{
    case 1:
        break;

    hello:
        Console.Write("In hello label");
        break;
    case 2:
        goto hello;
        break;
}