CA1008:Enums は 0 値を含んでいなければなりませんCA1008: Enums should have zero value

TypeNameTypeName EnumsShouldHaveZeroValueEnumsShouldHaveZeroValue
CheckIdCheckId CA1008CA1008
CategoryCategory Microsoft.DesignMicrosoft.Design
互換性に影響する変更点Breaking Change 改行しない - 追加するメッセージが表示されたら、 None非フラグ列挙体の値。Non-breaking - When you are prompted to add a None value to a non-flag enumeration. – 場合の名前を変更またはすべての列挙値を削除するように求められます。Breaking - When you are prompted to rename or remove any enumeration values.

原因Cause

空の列挙定数を適用したSystem.FlagsAttribute0 の値を持つメンバーを一切定義しません。An enumeration without an applied System.FlagsAttribute does not define a member that has a value of zero. または列挙型を持つ、適用されたFlagsAttributeメンバーを定義します。 ゼロの値を持つが、名前が 'None' ではありません。Or, an enumeration that has an applied FlagsAttribute defines a member that has a value of zero but its name is not 'None'. 列挙体は、複数を定義します。 または、メンバーの値が 0 です。Or, the enumeration defines multiple, zero-valued members.

既定では、このルールだけを確認、外部から参照できる列挙体が、これは構成可能なします。By default, this rule only looks at externally visible enumerations, but this is configurable.

規則の説明Rule description

その他の値の型と同じように、初期化されていない列挙型の既定値には 0 です。The default value of an uninitialized enumeration, just like other value types, is zero. フラグの属性の列挙されるため、既定値は、列挙体の有効な値に 0 の値を持つメンバーを定義する必要があります。A non-flags-attributed enumeration should define a member that has the value of zero so that the default value is a valid value of the enumeration. 必要に応じて、メンバーに名前を 'None' です。If appropriate, name the member 'None'. それ以外の場合、最もよく使用されるメンバーに 0 を割り当てます。Otherwise, assign zero to the most frequently used member. 既定では、宣言で、最初の列挙体メンバーの値が設定されていない場合、値は 0 です。By default, if the value of the first enumeration member is not set in the declaration, its value is zero.

列挙型を持つ場合、FlagsAttribute適用ゼロ値のメンバーの定義の名前には 'None' 列挙体の値が設定されていないことを示す必要があります。If an enumeration that has the FlagsAttribute applied defines a zero-valued member, its name should be 'None' to indicate that no values have been set in the enumeration. 使用とは異なり、他の目的は、ゼロ値のメンバーを使用して、FlagsAttributeで AND とまたはビットごとの演算子がメンバーと役に立ちません。Using a zero-valued member for any other purpose is contrary to the use of the FlagsAttribute in that the AND and OR bitwise operators are useless with the member. これは、ため、その 1 つだけのメンバーに値 0 を割り当てる必要があります。This implies that only one member should be assigned the value zero. フラグの属性の列挙体の値が 0 である複数のメンバーが発生した場合Enum.ToString()が 0 でないメンバーが正しくない結果が返されます。If multiple members that have the value zero occur in a flags-attributed enumeration, Enum.ToString() returns incorrect results for members that are not zero.

違反の修正方法How to fix violations

列挙体のフラグの属性には、この規則の違反を修正するには、0 以外の値を持つメンバーを定義します。これは、互換性に影響しない変更です。To fix a violation of this rule for non-flags-attributed enumerations, define a member that has the value of zero; this is a non-breaking change. 値が 0 のメンバーを定義する列挙型フラグの属性、名前のメンバーを 'None' と 0 以外の値を持つその他のメンバーを削除します。これは、重大な変更です。For flags-attributed enumerations that define a zero-valued member, name this member 'None' and delete any other members that have a value of zero; this is a breaking change.

警告を抑制します。When to suppress warnings

以前にリリース済みフラグの属性の列挙型を除く、この規則による警告を抑制しないでください。Do not suppress a warning from this rule except for flags-attributed enumerations that have previously shipped.

構成機能Configurability

この規則からを実行している場合FxCop アナライザー (および静的コード分析ではなく)、のどの部分を構成することができます、コードベースでこのルールを実行する、アクセシビリティに基づきます。If you're running this rule from FxCop analyzers (and not through static code analysis), you can configure which parts of your codebase to run this rule on, based on their accessibility. など、非パブリック API サーフェイスに対してのみ、ルールを実行するかを指定するには、プロジェクト内の .editorconfig ファイルに次のキー/値ペアを追加します。For example, to specify that the rule should run only against the non-public API surface, add the following key-value pair to an .editorconfig file in your project:

dotnet_code_quality.ca1008.api_surface = private, internal

このルールだけ、すべてのルール、またはすべてのルールは、このオプションは、このカテゴリ (デザイン) で構成できます。You can configure this option for just this rule, for all rules, or for all rules in this category (Design). 詳細については、次を参照してください。構成 FxCop アナライザーします。For more information, see Configure FxCop analyzers.

Example

次の例は、ルールに適合する 2 つの列挙型と列挙体は、BadTraceOptions規則に違反しています。The following example shows two enumerations that satisfy the rule and an enumeration, BadTraceOptions, that violates the rule.

using namespace System;

namespace DesignLibrary
{
   public enum class TraceLevel
   {
      Off     = 0,
      Error   = 1,
      Warning = 2,
      Info    = 3,
      Verbose = 4
   };

   [Flags]
   public enum class TraceOptions
   {
      None         =    0,
      CallStack    = 0x01,
      LogicalStack = 0x02,
      DateTime     = 0x04,
      Timestamp    = 0x08
   };

   [Flags]
   public enum class BadTraceOptions
   {
      CallStack    =    0,
      LogicalStack = 0x01,
      DateTime     = 0x02,
      Timestamp    = 0x04
   };
}

using namespace DesignLibrary;

void main()
{
   // Set the flags.
   BadTraceOptions badOptions = safe_cast<BadTraceOptions> 
      (BadTraceOptions::LogicalStack | BadTraceOptions::Timestamp);

   // Check whether CallStack is set.
   if((badOptions & BadTraceOptions::CallStack) == 
         BadTraceOptions::CallStack)
   {
      // This 'if' statement is always true.
   }
}
using System;

namespace DesignLibrary
{
   public enum TraceLevel
   {
      Off     = 0,
      Error   = 1,
      Warning = 2,
      Info    = 3,
      Verbose = 4
   }

   [Flags]
   public enum TraceOptions
   {
      None         =    0,
      CallStack    = 0x01,
      LogicalStack = 0x02,
      DateTime     = 0x04,
      Timestamp    = 0x08,
   }

   [Flags]
   public enum BadTraceOptions
   {
      CallStack    =    0,
      LogicalStack = 0x01,
      DateTime     = 0x02,
      Timestamp    = 0x04,
   }

   class UseBadTraceOptions
   {
      static void Main()
      {
         // Set the flags.
         BadTraceOptions badOptions = 
            BadTraceOptions.LogicalStack | BadTraceOptions.Timestamp;

         // Check whether CallStack is set.
         if((badOptions & BadTraceOptions.CallStack) == 
             BadTraceOptions.CallStack)
         {
            // This 'if' statement is always true.
         }
      }
   }
}
Imports System

Namespace DesignLibrary

   Public Enum TraceLevel
      Off     = 0
      AnError = 1
      Warning = 2
      Info    = 3
      Verbose = 4
   End Enum

   <Flags> _
   Public Enum TraceOptions
      None         =    0
      CallStack    = &H01
      LogicalStack = &H02
      DateTime     = &H04
      Timestamp    = &H08
   End Enum

   <Flags> _
   Public Enum BadTraceOptions
      CallStack    =    0
      LogicalStack = &H01
      DateTime     = &H02
      Timestamp    = &H04
   End Enum

   Class UseBadTraceOptions

      Shared Sub Main()

         ' Set the flags.
         Dim badOptions As BadTraceOptions = _
            BadTraceOptions.LogicalStack Or BadTraceOptions.Timestamp

         ' Check whether CallStack is set.
         If((badOptions And BadTraceOptions.CallStack) = _
             BadTraceOptions.CallStack)
            ' This 'If' statement is always true.
         End If

      End Sub
         
   End Class

End Namespace

関連項目See also