不能将 long 类型转换为 T,这里 T 是一个 Enum 的值

cannot convert type long to T, here T is an Enum's value

  T  bitmask = (T)PermissionBitMask;
  bool hasAccess = (bitmask & (T)operation) == (T)operation;

//这里T是一个long值的Enum类型,PermissionBitMask是一个long值的Enum,operation是一个整型值。

public bool CheckAccess<T>(int operation) where T : Enum 
{ 
    bool hasAccess = false; 
    T bitmask = (T)_permission.PermissionBitMask; 
    hasAccess = bitmask & (T)operation == (T)operation; 
    return hasAccess; 
} 

您可以使用 Enum.ToObject() 方法作为:

    private static T IntegerToEnum<T>(int i)
    {
        if (!typeof(T).IsEnum)
        {
            throw new ArgumentException("...");
        }
        return (T)Enum.ToObject(typeof(T), i);
    }

    private static T LongToEnum<T>(long i)
    {
        if (!typeof(T).IsEnum)
        {
            throw new ArgumentException("...");
        }
        return (T)Enum.ToObject(typeof(T), i);
    }

考虑到枚举是可转换的,您可以将 IConvertible 限制在 T:

public bool HasAccess<T>(T permissionBitMask, long operation) where T: IConvertible
{
    long bitmask = permissionBitMask.ToInt64(null);
    return (bitmask & operation) == operation;
}

如果您可以使用 C# 7.3,也可以 System.Enum 进行约束。