31

これは列挙型の定義です:

[Flags]
enum Animals
{
    None = 0,
    Dog = 1,
    Cat = 2,
    Horse = 4,
    Zebra = 8,
}

次のコードでは、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
4

7 に答える 7

48

HasFlag効果的にこれです:

HasFlag = (GivenFlag & Value) == GivenFlag;

//"Anything" AND 0 == 0  --> always true
于 2013-03-15T15:51:16.937 に答える
10

私は自分自身の前にこれに反対しました。これは、.NET Framework の設計によるものです。

flag の基になる値がゼロの場合、メソッドは true を返します。この動作が望ましくない場合は、次の例に示すように、Equals メソッドを使用して 0 と等しいかどうかをテストし、flag の基になる値が 0 以外の場合にのみ HasFlag を呼び出すことができます。

これについては、次の MSDN 記事でもう少し詳しく読むことができます: http://msdn.microsoft.com/en-GB/library/system.enum.hasflag.aspx

于 2013-03-15T15:52:14.003 に答える
0

Enum.HasFlags次のようにうまく解決します。

var hasNone = (myAnimals & Animals.None) == Animals.None

これは、値がゼロの列挙型フィールドの場合は常に当てはまります。

于 2013-03-15T15:51:23.137 に答える
0

MSDNから

HasFlag メソッドは、次のブール式の結果を返します。

thisInstance And flag = flag
于 2013-03-15T15:51:45.270 に答える
0

これは、メソッドの定義された動作ですHasFlagMSDNのドキュメントから

flag の基になる値がゼロの場合、メソッドは true を返します

于 2013-03-15T15:52:00.743 に答える