是否可以使用带有枚举的switch语句来捕获未设置的标志

时间:2019-05-20 21:40:18

标签: c# enums

是否可以使用switch语句来捕获枚举中未设置的标志?我尝试附加一个!到sampleEnum.Unset1等的前面,但是没有用。

public enum sampleEnum
{
    Set1   = 1,
    Set2   = 2,
    Unset4 = 4,
    Set8   = 8
}

switch (sampleEnum)
{
    case sampleEnum.Set1:
        Console.WriteLine("This should not run");
        break;
    case sampleEnum.Set2:
        Console.WriteLine("This should not run");
        break;
    case sampleEnum.Unset4:
        Console.WriteLine("This should run");
        break;
    case sampleEnum.Set8:
        Console.WriteLine("This should not run");
        break;
    default:
        break;
}

2 个答案:

答案 0 :(得分:0)

我不确定您真正关心的是哪种实际情况,但是我们应该能够解决这个问题

我更改了一些名称,但假设使用枚举:

public enum enumExampo
{
    Set1   = 1,
    Set2   = 2,
    Unset4 = 4,
    Set8   = 8,
    set9 = 9
}

我设置了一种方法,例如:

public static void checkExampo(enumExampo exampo)
{
    switch (exampo)
    {
        case enumExampo.Set1:
            Console.WriteLine("This should not run");
            break;
        case enumExampo.Set2:
            Console.WriteLine("This should not run");
            break;
        case enumExampo.Unset4:
            Console.WriteLine("This should run");
            break;
        case enumExampo.Set8:
            Console.WriteLine("This should not run");
            break;
        case new enumExampo():
            Console.WriteLine("is a new Instance");
            break;
        default:
            Console.WriteLine($"Default, flagged for {exampo}");
            break;
    }
}

然后是用法:

 var sampleEnum = new enumExampo();
 var exNiner = enumExampo.set9;

 checkExampo(sampleEnum);
 checkExampo(exNiner);

在以下控制台中向我们提供结果:

  

是一个新实例
  默认,标记为set9

答案 1 :(得分:0)

switch语句只能处理与常量的相等比较。因此非常有限。做您要问的唯一方法就是像这样愚蠢的事情:

switch (sampleEnum)
{
    case sampleEnum.Set4:
        break;
    default:
        Console.WriteLine("This only runs when Set4 is not set.");
        break;
}

如果比较比较复杂,最好使用if,它更灵活(而且我认为还是更容易阅读)。

if (!sampleEnum.HasFlag(Set4))
{
    Console.WriteLine("This will run only when Set4 is not set.");
}