运算符'&'不能应用于类型'T'和'T'的操作数,其中T:Enum

时间:2019-03-03 06:34:52

标签: generics enums type-constraints enum-flags c#-7.3

我有一个具有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.CatAnimal.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 :(得分:0)

我以此方式更改方法

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

现在可以正常工作

答案 1 :(得分:0)

您可以通过HasFlag获得相同的结果。