CA1008 : Les enums doivent avoir la valeur zéro

TypeName

EnumsShouldHaveZeroValue

CheckId

CA1008

Catégorie

Microsoft.CSharp

Modification avec rupture

Modification sans rupture - Lorsque vous êtes invité à ajouter une valeur Aucun à une énumération sans indicateur. Modification avec rupture - Lorsque vous êtes invité à renommer ou à supprimer une valeur d'énumération.

Cause

Une énumération sans un System.FlagsAttribute appliqué ne définit pas de membre de valeur zéro ; ou une énumération avec un FlagsAttribute appliqué définit un membre de valeur zéro, mais son nom n'est pas 'None', ou l'énumération définit plusieurs membres de valeur zéro.

Description de la règle

La valeur par défaut d'une énumération non initialisée, comme d'autres types valeur, est zéro. Une énumération attribuée sans indicateur doit définir un membre de valeur zéro afin que la valeur par défaut soit une valeur valide de l'énumération. Si besoin, nommez le membre 'None'. Sinon, assignez zéro au membre le plus utilisé. Remarquez que, par défaut, si la valeur du premier membre de l'énumération n'est pas définie dans la déclaration, sa valeur est zéro.

Si une énumération qui dispose du FlagsAttribute appliquée définit un membre de valeur zéro, son nom doit être 'None' pour indiquer qu'aucune valeur n'a été définie dans l'énumération. Utiliser un membre de valeur zéro à toute autre fin est contraire à l'utilisation du FlagsAttribute en ce que les opérateurs de niveau bit AND et OR sont inutiles avec le membre. Ce qui implique que seul un membre doit se voir assigner la valeur zéro. Remarquez que si plusieurs membres ont pour valeur zéro dans une énumération attribuée par indicateurs, Enum.ToString() retourne des résultats inexacts dans le cas des membres non nuls.

Comment corriger les violations

Pour corriger une violation de cette règle dans le cas d'énumérations attribuée sans indicateur, définissez un membre de valeur zéro ; il s'agit d'une modification sans rupture. Dans le cas d'énumérations attribuées par indicateurs qui définissent un membre de valeur zéro, nommez ce membre 'None' et supprimez tout autre membre de valeur zéro ; il s'agit d'une modification avec rupture.

Quand supprimer les avertissements

Ne supprimez aucun avertissement de cette règle, sauf dans le cas d'énumérations attribuées par indicateurs fournies antérieurement.

Exemple

L'exemple suivant présente deux énumérations qui satisfont la règle et une énumération, BadTraceOptions, qui l'enfreint.

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
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.
         }
      }
   }
}
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.
   }
}

Règles connexes

CA2217 : Ne pas marquer les enums avec FlagsAttribute

CA1700 : Ne nommez pas les valeurs enum 'Reserved'

CA1712 : N'ajoutez pas le nom de type en guise de préfixe à des valeurs enum

CA1028 : Enum Storage doit être Int32

CA1027 : Marquer les enums avec FlagsAttribute

Voir aussi

Référence

System.Enum