Можно ли использовать оператор switch с enum для перехвата неустановленных флагов? - PullRequest
0 голосов
/ 21 мая 2019

Можно ли использовать оператор 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 голосов
/ 21 мая 2019

Оператор switch может обрабатывать только сравнение на равенство с константой.Так что это очень ограничено.Единственный способ сделать то, что вы спрашиваете, - это что-то глупое:мое мнение легче читать в любом случае).

if (!sampleEnum.HasFlag(Set4))
{
    Console.WriteLine("This will run only when Set4 is not set.");
}
0 голосов
/ 21 мая 2019

Я не уверен на 100%, какой реальный сценарий вас беспокоит, но мы должны быть в состоянии справиться с этим

Я изменил некоторые имена, но предполагая Enum:

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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...