14

HasFlagsの新機能を試していますが、次の機能が機能するかどうか疑問に思っていまし

enum.HasFlag(AccessRights.Read | AccessRights.Write)

...そうではないようです...

 DBAccessRights rights = (DBAccessRights)permission.PermissionFlags;
  if (rights.HasFlag(DBAccessRights.WikiMode))
  {
     // works
  }


  if (rights.HasFlag(DBAccessRights.WikiMode | DBAccessRights.CreateNew))
  {
     // Doesn't work    
  }

  DBAccessRights flags = DBAccessRights.WikiMode | DBAccessRights.CreateNew;
  if (rights.HasFlag(flags))
  {
     // Doesn't work
  }
4

5 に答える 5

34

documentationを考えると、値にこれらのフラグの両方がある場合、 true を返すと思います。

値にこれらのフラグのいずれかがあるかどうかをテストしたい場合は、

value.HasFlag(AccessRights.Read) | value.HasFlag(AccessRights.Write)

それが読みにくい場合は、私のUnconstrained Melodyプロジェクトを参照してください。必要な機能が既に ( の拡張メソッドとしてFlags.cs)含まれている場合があります。

// Same as value.HasFlag(AccessRights.Read | AccessRights.Write)
value.HasAll(AccessRights.Read | AccessRights.Write)

// Same as value.HasFlag(AccessRights.Read) | value.HasFlag(AccessRights.Write)
value.HasAny(AccessRights.Read | AccessRights.Write)

それらはそれをより明確にするでしょう、IMO。また、ボクシングを回避し、タイプセーフになります:)

于 2011-11-02T17:10:12.820 に答える
20

MSDNから:

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

thisInstance とフラグ = フラグ

のような複雑なフラグの場合、これはすべての「含まれる」フラグが存在AccessRights.Read | AccessRights.Writeすることを確認します。

おそらく、フラグのいずれかが存在することを確認したいでしょう。その場合、次のことができます。

myAccessRights & (AccessRights.Read | AccessRights.Write) != 0 
于 2011-11-02T17:11:20.970 に答える
3

|演算子はビットごとのOR です。Readが 1 でWrite2 の場合、値は 3 であることを意味しますRead | Write(バイナリ表現を参照)。そのため、変数に両方が設定されているHasFlag場合にのみ true を返します。enum ReadWrite

于 2011-11-02T17:10:12.180 に答える
1

または、式の順序を逆にすることもできます。

//returns true - a bit easier on the eye
(AccessRights.Read | AccessRights.Write).HasFlag(myAccessRights)

これは、読み取り |または読み取りのいずれかがある場合に true を返します。書き込みアクセス。これは、機能的には次のものと同等です。

//also returns true - as per @Ani's answer
myAccessRights & (AccessRights.Read | AccessRights.Write) != 0

編集

コメントで指摘されているように、最初の式は、myAccessRights が空の場合は true を返し、myAccessRights に読み取りと書き込み以外のものがある場合は false を返します。

于 2015-12-20T23:09:11.210 に答える