Оператор '&' не может быть применен к операндам типа 'T' и 'T', где T: Enum - PullRequest
0 голосов
/ 03 марта 2019

У меня есть это перечисление с атрибутом Flags

[Flags]
public enum Animal
{
    Null = 0,
    Cat = 1,
    Dog = 2,
    CatAndDog = Cat | Dog
}

И я использую C # 7.3, который допускает ограничения типа, такие как:

where T : Enum

Я создаю некоторый метод расширения:

public static bool IsMoreOrEqualThan<T>(this T a, T b) where T : Enum
{
    return (a & b) == b;
}

Возвращает true, если

1) Элементы перечисления сравнимы.Например: Animal.Cat и Animal.Dog несопоставимы.

AND

2) Элемент a больше или равен элементу b

Примеры:

Animal.Cat.IsMoreOrEqualThan(Animal.Null)//true
Animal.Cat.IsMoreOrEqualThan(Animal.Cat)//true
Animal.Cat.IsMoreOrEqualThan(Animal.Dog)//false
Animal.Cat.IsMoreOrEqualThan(Animal.CatAndDog)//false

==================================

Но яесть ошибка компиляции: Operator '&' cannot be applied to operands of type 'T' and 'T'

Кажется, разработчики .Net забыли разрешить побитовые операции между универсальными типами с ограничением типов where T : Enum

Может кто-нибудь знает ответ?

Ответы [ 2 ]

0 голосов
/ 03 марта 2019

Вы можете достичь того же результата с HasFlag .

0 голосов
/ 03 марта 2019

Я меняю свой метод таким образом

public static bool IsMoreOrEqualThan<T>(this T a, T b) where T : Enum
{
    return (Convert.ToInt32(a) & Convert.ToInt32(b)) == Convert.ToInt32(b);
}

и теперь он работает

...