Partager via


CA1028 : Enum Storage doit être Int32

TypeName

EnumStorageShouldBeInt32

CheckId

CA1028

Catégorie

Microsoft.CSharp

Modification avec rupture

Oui

Cause

Le type sous-jacent d'une énumération publique n'est pas System.Int32.

Description de la règle

Une énumération est un type valeur qui définit un jeu de constantes nommées associées. Par défaut, le type de données System.Int32 est utilisé pour stocker la valeur de constante. Bien que vous puissiez modifier ce type sous-jacent, ce n'est ni nécessaire, ni recommandé dans la plupart des scénarios. Remarquez que l'utilisation d'un type de données plus petit que Int32 n'entraîne aucun gain de performance significatif. Si vous ne pouvez pas utiliser le type de données par défaut, vous devez utiliser l'un des types intégraux conformes CLS (Common Language System), Byte, Int16, Int32 ou Int64, afin de garantir que toutes les valeurs de l'énumération peuvent être représentées dans des langages de programmation conformes CLS.

Comment corriger les violations

Pour corriger une violation de cette règle, à moins qu'il y ait des problèmes de compatibilité ou de taille, utilisez Int32. Dans les situations où Int32 n'est pas assez grand pour contenir les valeurs, utilisez Int64. Si la compatibilité descendante requiert un type de données plus petit, utilisez Byte ou Int16.

Quand supprimer les avertissements

Supprimez un avertissement de cette règle uniquement si des problèmes de compatibilité descendante le requièrent. Dans les applications, la non-conformité à cette règle ne provoque généralement aucun problème. Dans les bibliothèques où l'interopérabilité des langages est requise, la non-conformité à cette règle peut avoir une incidence négative sur vos utilisateurs.

Exemple de violation

Description

L'exemple suivant présente deux énumérations qui n'utilisent pas le type de données sous-jacent recommandé.

Code

Imports System

Namespace Samples

    <Flags()> _
    Public Enum Days As UInteger
        None = 0
        Monday = 1
        Tuesday = 2
        Wednesday = 4
        Thursday = 8
        Friday = 16
        All = Monday Or Tuesday Or Wednesday Or Thursday Or Friday
    End Enum

    Public Enum Color As SByte
        None = 0
        Red = 1
        Orange = 3
        Yellow = 4
    End Enum

End Namespace
using System;

namespace DesignLibrary
{
   [Flags]
   public enum Days : uint
   {
      None        = 0,
      Monday      = 1,
      Tuesday     = 2,
      Wednesday   = 4,
      Thursday    = 8,
      Friday      = 16,
      All         = Monday| Tuesday | Wednesday | Thursday | Friday
   }

   public enum Color :sbyte
   {
      None        = 0,
      Red         = 1,
      Orange      = 3,
      Yellow      = 4
   }
}

Exemple de résolution

Description

L'exemple suivant corrige la violation précédente en modifiant le type de données sous-jacent en Int32.

Code

Imports System

Namespace Samples

    <Flags()> _
    Public Enum Days As Integer
        None = 0
        Monday = 1
        Tuesday = 2
        Wednesday = 4
        Thursday = 8
        Friday = 16
        All = Monday Or Tuesday Or Wednesday Or Thursday Or Friday
    End Enum

    Public Enum Color As Integer
        None = 0
        Red = 1
        Orange = 3
        Yellow = 4
    End Enum

End Namespace
using System;

namespace Samples
{
    [Flags]
    public enum Days : int
    {
        None        = 0,
        Monday      = 1,
        Tuesday     = 2,
        Wednesday   = 4,
        Thursday    = 8,
        Friday      = 16,
        All         = Monday| Tuesday | Wednesday | Thursday | Friday
    }

    public enum Color : int
    {
        None        = 0,
        Red         = 1,
        Orange      = 3,
        Yellow      = 4
    }
}

Règles connexes

CA1008 : Les enums doivent avoir la valeur zéro

CA1027 : Marquer les enums avec FlagsAttribute

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

Voir aussi

Référence

System.Byte

System.Int16

System.Int32

System.Int64