运算符'&'不能应用于'T'和'T'类型的操作数

Jon*_*ood 9 c# generics generic-method

我的应用程序定义了几个enum包含该[Flags]属性的s .

我想写一个小的实用程序方法来检查是否为这些中enum的任何一个设置了标志,我想出了以下内容.

protected static bool IsFlagSet<T>(ref T value, ref T flags)
{
    return ((value & flags) == flags);
}
Run Code Online (Sandbox Code Playgroud)

但这给了我错误"运算符'&'不能应用于'T'和'T'类型的操作数".

这可以使用吗?

Hen*_*man 15

Enum类已经具有实用程序功能:Enum.HasFlag(Flag f),请参阅MSDN上示例

 if (petsInFamily.HasFlag(Pet.Dog))
        familiesWithDog++;
Run Code Online (Sandbox Code Playgroud)

注意:这是在C#4中引入的.虽然它非常易读,但它可能存在一些性能问题.


Dew*_*wfy 5

我知道我的回答为时已晚,但我发现了这个问题的真正惊人的解决方案。从 .Net 4 开始,我们可以dynamic在 C# 中使用类型。您的方法可以重写:

protected static bool IsFlagSet<T>(T value, T flags)
{
    dynamic a = value;
    dynamic b = flags;
    return ((a & b) == flags);
}
Run Code Online (Sandbox Code Playgroud)

dynamic如果类型支持方法/运算符,其背后的想法允许您推迟到运行时T。因此,如果&定义了T运行时,则成功。


Yoc*_*mer 2

& 是类类型的运算符。这意味着类 T 必须有一个重载运算符 & 的方法。

.Net 不能指望每个类都会有它。所以它失败了。

您可以做的是创建一个基类,将运算符重载声明为方法。

然后使用Constraints声明 T 使用该基类:

protected static bool IsFlagSet<T> where T: BaseclassWithAnd (ref T value, ref T flags)
{
    return ((value & flags) == flags);
}
Run Code Online (Sandbox Code Playgroud)