15

在 aswitch中,如果我们写任何单词或单个字母而不是default 它,则不会引发错误。例如

switch(10)
{
    case 1:
    break;

    hello:
    break;
}

它运行而不会引发错误。

谁能解释这是如何工作的?

4

3 回答 3

16

它正在编译,因为它hello:是一个标签,因此可以是一个goto. 当我编译这个时,我收到关于未引用标签的警告(因为我没有 goto)

这是您可以在 LINQPad 中使用的示例 - 您会注意到它同时打印“1”和“hello”:

switch(1)
{
    case 1:
        "1".Dump();
        goto hello;
    break;

    hello:
        "hello".Dump();
        break;
}
于 2012-11-15T05:50:23.603 回答
13

switch与声明无关。它是(由于不好的做法而很少使用)goto语句的标签标识符。

goto something2;
something1:
    Console.WriteLine("world");
    goto done;
something2:
    Console.WriteLine("hello");
goto something1;
done:
于 2012-11-15T05:50:28.187 回答
5

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

switch (10)
{
    case 1:
        break;

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

在上面,您正在为 switch 语句中的 goto 语句定义一个标签。如果 switch 语句落到case 2,那么它会去标签hello。由于您的原始代码片段没有 agoto hello;您将收到未引用标签的警告。

您的标签hello 不必对 switch 语句做任何事情(除了在内部定义)。

于 2012-11-15T05:54:37.157 回答