C# 为什么';这个转辙机里面的转辙机不工作吗?

C# 为什么';这个转辙机里面的转辙机不工作吗?,c#,switch-statement,C#,Switch Statement,对于本计划: class Program { static void Main(string[] args) { var state = States.One; switch (state) { case States.One: Console.WriteLine("One"); break; case States.Ze

对于本计划:

class Program
{
    static void Main(string[] args)
    {
        var state = States.One;
        switch (state)
        {
            case States.One:
                Console.WriteLine("One");
                break;
            case States.Zero:
                goto case States.One;
        }
    }
}

public enum States : ulong
{
    Zero = 0,
    One = 1,
}
我得到:

开关表达式或大小写标签必须是bool、char、string、, 整数、枚举或相应的可为空类型“

但是
state
变量是
enum
类型。如果我注释
goto case
行,错误就会消失


我正在使用VS2013。NET 4.5.1.

enum
被键入为
ulong
并且您同时使用
goto case
时,这是C#编译器的一部分。如果您从
enum
中删除
ulong
,它的编译效果很好。因为没有多少人会遇到这个问题,所以他们不会专注于解决它。

您可以使用goto标签,而不是直接在goto语句中使用
大小写:

switch (state)
{
    case States.One:
caseZeroRedirect:
        Console.WriteLine("One");
        break;
    case States.Zero:
        CouldDoSomethingFirst();
        goto caseZeroRedirect;
}

根据您的用例,这也可能是您的一个选项:

switch (state)
{
    case States.Zero:
    case States.One:
        Console.WriteLine("One");
        break;
}
这应该根据这里的一个例子来进行:

您应该尝试以下方法:-

switch (state)
{
 case States.Zero:
 case States.One:
    Console.WriteLine("1");
    break;
}

请不要使用
goto
-practice@MaxMommersteeg有时,不为其创建数十个空隙是有用且清晰的switch@MaxMommersteeg. OP似乎正在尝试创建一个开关fall-thru,这必须使用C#中的goto语句来完成。在C/C++中,您不需要使用goto来完成fall-thru。此外,首先要考虑为什么“Goto被认为是有害的”——因为它可以导致非结构化代码中的SPAGETTI代码。@ Max MMOMLSTEGE:<代码> Goto < /C> > <代码>开关只在文章的结尾提到。它指的是a,首先是解释“Goto在开关内部使用。这在某些情况下可以提高性能并减少代码大小。”(我自己强调)我认为
Goto case
可能是C#中存在的
Goto
的最有效用法。它可以与任何其他整数类型(有符号或无符号)配合使用,所以我想说这也是一个bug。它确实被记录为bug。但是你可以离开ulong,只使用goto中的值,比如“goto case 1”,goto case 0。。。您将看到一条警告,“goto case”值不能隐式转换为类型“States”@blacai-Well,它不能处理超过
int.MaxValue
的值。如果这不是问题的话,我们可以试试。记录在案:它已经在Rosyln被修复了,所以最后一句话可能是不公平的。