2013-03-15 9 views
18

になし(0)の値に対してtrueを返す:HasFlagsは常にこれがenum定義で列挙

、次のコードを与え、なぜ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 

答えて

19

HasFlag効果的にこれです:

HasFlag = (GivenFlag & Value) == GivenFlag; 

//"Anything" AND 0 == 0 --> always true 
0

まあEnum.HasFlags次のようなものとして解決します。

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

これは常にゼロ値-列挙フィールドのためにtrueになります。

0

HasFlag方法MSDN

から、次のブール式の結果を返します。

thisInstance And flag = flag 
0

これは、HasFlagメソッドの動作の定義にすぎません。 MSDNドキュメントから

フラグの根底にある値がゼロであれば、この方法は、私が自分の前に、この反対作ってみた真

6

を返します。 これは.NET Frameworkの仕様です。

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

あなたがここにMSDNの記事でこのことについてもう少しを読むことができ

http://msdn.microsoft.com/en-GB/library/system.enum.hasflag.aspx

2

あり、これがなぜ起こるか記述回答の過多が既にあるので、あなたは何を得るために何ができるか、私はちょうどそれを追加しますその場合はHasFlagを使用しないで、代わりにvar hasNone = myAnimals == Animals.Noneを使用してください。

私は個人的には実際には拡張メソッドを嫌っていますが、myOptionEnum.HasNoFlags()を書き込むことが本当に価値がある場合は、Enumの拡張子にこれを入れることができます。私はちょうどこの特殊なケースでNone値を明示的にチェックして実行します。

関連する問題