HasFlags总是为枚举中的None(0)值返回true

Hen*_*und 23 c# enums enum-flags

这是枚举定义:

[Flags]
enum Animals
{
    None = 0,
    Dog = 1,
    Cat = 2,
    Horse = 4,
    Zebra = 8,
}
Run Code Online (Sandbox Code Playgroud)

现在,给定以下代码,为什么HasFlag方法对值Animals.None返回true?

Animals myAnimals = Animals.Dog | Animals.Horse;

var hasNone = myAnimals.HasFlag(Animals.None);    //true! Why?
var hasCat = myAnimals.HasFlag(Animals.Cat);      //false
var hasDog = myAnimals.HasFlag(Animals.Dog);      //true
var hasHorse = myAnimals.HasFlag(Animals.Horse);  //true
var hasZebra = myAnimals.HasFlag(Animals.Zebra);  //false
Run Code Online (Sandbox Code Playgroud)

Aus*_*nen 32

HasFlag 实际上是这样的:

HasFlag = (GivenFlag & Value) == GivenFlag;

//"Anything" AND 0 == 0  --> always true
Run Code Online (Sandbox Code Playgroud)


Mar*_*tin 8

我在自己面前反对这一点.它是在.NET Framework中设计的:

如果flag的基础值为零,则该方法返回true.如果不希望出现这种情况,可以使用Equals方法测试零的相等性,并仅在flag的基础值为非零时调用HasFlag,如下例所示.

您可以在MSDN文章中阅读更多相关内容:http://msdn.microsoft.com/en-GB/library/system.enum.hasflag.aspx