Невозможно применить оператор '&' для общих параметров Enum - PullRequest
0 голосов
/ 10 сентября 2018

Я пытаюсь написать несколько общих методов расширения для перечислений в стиле флага. Начиная с C # 7.3, аргумент типа TFlag может быть помечен как Enum, но компилятор выдает ошибку для выражения flags & flagToTest, он говорит, что «Оператор» & не может быть применен для типов TFlag и TFlag. Поскольку TFlag - это Enum, оператор '&' должен нормально работать.

public static bool IsSet<TFlag>(this TFlag flags, TFlag flagToTest) where TFlag : Enum
{
    if (!Attribute.IsDefined(typeof(TFlag), typeof(FlagsAttribute)))
        throw new InvalidOperationException("The given enum type is not decorated with Flag attribute.");

    if (flagToTest.Equals(0)) 
        throw new ArgumentOutOfRangeException(nameof(flagToTest), "Value must not be 0");

    return (flags & flagToTest) == flagToTest;
}

1 Ответ

0 голосов
/ 10 сентября 2018

Прежде всего, взгляните на этот ответ https://stackoverflow.com/a/50219294/6064728. Вы можете написать свою функцию следующим образом:

public static bool IsSet<TFlag>(this TFlag flags, TFlag flagToTest) where TFlag : Enum
{
    if (!Attribute.IsDefined(typeof(TFlag), typeof(FlagsAttribute)))
        throw new InvalidOperationException("The given enum type is not decorated with Flag attribute.");

    if (flagToTest.Equals(0)) throw new ArgumentOutOfRangeException(nameof(flagToTest), "Value must not be 0");
    int a = Convert.ToInt32(flags);
    int b = Convert.ToInt32(flagToTest);
    return (a & b) == b;
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...