C# 无法应用'&';通用枚举参数的运算符

C# 无法应用'&';通用枚举参数的运算符,c#,.net,generics,enums,c#-7.3,C#,.net,Generics,Enums,C# 7.3,我正在尝试为标志样式枚举编写一些通用扩展方法。从C#7.3开始,TFlag类型参数可以标记为Enum,但编译器为表达式flags&flagToTest抛出一个错误,它表示“运算符”&“不能应用于类型TFlag和TFlag”。由于TFlag是一个枚举,“&”运算符应该可以正常工作 public static bool IsSet<TFlag>(this TFlag flags, TFlag flagToTest) where TFlag : Enum { if (!Attrib

我正在尝试为标志样式枚举编写一些通用扩展方法。从C#7.3开始,TFlag类型参数可以标记为Enum,但编译器为表达式
flags&flagToTest
抛出一个错误,它表示“运算符”&“不能应用于类型TFlag和TFlag”。由于TFlag是一个枚举,“&”运算符应该可以正常工作

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;
}
public static bool IsSet(此TFlag flags,TFlag flagtost),其中TFlag:Enum
{
如果(!Attribute.IsDefined(typeof(TFlag),typeof(FlagsAttribute)))
抛出新的InvalidOperationException(“给定的枚举类型未使用Flag属性修饰”);
如果(flagToTest.等于(0))
抛出新ArgumentOutOfRangeException(nameof(flagToTest),“值不能为0”);
返回(flags&flagToTest)=flagToTest;
}

首先,看看这个答案。 您可以这样或类似这样编写函数:

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;
}
public static bool IsSet(此TFlag flags,TFlag flagtost),其中TFlag:Enum
{
如果(!Attribute.IsDefined(typeof(TFlag),typeof(FlagsAttribute)))
抛出新的InvalidOperationException(“给定的枚举类型未使用Flag属性修饰”);
如果(flagToTest.Equals(0))抛出新ArgumentOutOfRangeException(nameof(flagToTest)),则“值不能为0”);
int a=转换为32(标志);
int b=转换为32(flagToTest);
回报率(a&b)=b;
}

我认为您可以调用枚举实例上的“HasFlag”方法来提供此功能。它们确实需要“Flags”属性,就像您的代码检查标记一样。