CA1028 : Enum Storage doit être Int32

Propriété Value
Identificateur de la règle CA1028
Titre Enum Storage doit être Int32
Catégorie Conception
Le correctif est cassant ou non cassant Rupture
Activé par défaut dans .NET 8 Non

Cause

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

Par défaut, cette règle examine uniquement les énumérations visibles en externe, mais elle est configurable.

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 utilisé pour stocker la valeur de constante est System.Int32. Bien que ce type sous-jacent soit modifiable, ce n’est ni nécessaire, ni recommandé dans la plupart des scénarios. Aucun gain de performances significatif n’est obtenu à l’aide d’un type de données inférieur à Int32. Si vous ne pouvez pas utiliser le type de données par défaut, vous devez opter pour l’un des types intégraux compatibles CLS (Common Language System), Byte, Int16, Int32 ou Int64, pour que toutes les valeurs de l’énumération puissent être représentées dans les langages de programmation compatibles CLS.

Comment corriger les violations

Pour corriger une violation de cette règle, hors problèmes de taille et de compatibilité, utilisez Int32. Dans le cas où Int32 n’est pas assez grand pour contenir les valeurs, choisissez Int64. Si un type de données plus petit est nécessaire à des fins de compatibilité descendante, optez pour Byte ou Int16.

Quand supprimer les avertissements

Ne supprimez un avertissement de cette règle qu’en cas de problèmes de compatibilité descendante. Dans les applications, le non-respect de cette règle ne pose généralement pas de problèmes. Il peut en revanche nuire à vos utilisateurs dans les bibliothèques, où l’interopérabilité entre les langages est requise.

Supprimer un avertissement

Si vous voulez supprimer une seule violation, ajoutez des directives de préprocesseur à votre fichier source pour désactiver et réactiver la règle.

#pragma warning disable CA1028
// The code that's violating the rule is on this line.
#pragma warning restore CA1028

Pour désactiver la règle sur un fichier, un dossier ou un projet, définissez sa gravité sur none dans le fichier de configuration.

[*.{cs,vb}]
dotnet_diagnostic.CA1028.severity = none

Pour plus d’informations, consultez Comment supprimer les avertissements de l’analyse de code.

Configurer le code à analyser

Utilisez l’option suivante pour configurer les parties de votre codebase sur lesquelles exécuter cette règle.

Vous pouvez configurer cette option pour cette règle uniquement, pour toutes les règles auxquelles elle s’applique ou pour toutes les règles de cette catégorie (Conception) auxquelles elle s’applique. Pour plus d’informations, consultez Options de configuration des règles de qualité du code.

Inclure des surfaces d’API spécifiques

Vous pouvez configurer les parties de votre codebase sur lesquelles exécuter cette règle, en fonction de leur accessibilité. Par exemple, pour spécifier que la règle doit s’exécuter uniquement sur la surface d’API non publique, ajoutez la paire clé-valeur suivante à un fichier .editorconfig dans votre projet :

dotnet_code_quality.CAXXXX.api_surface = private, internal

Exemple

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

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

L’exemple suivant corrige la violation précédente en replaçant le type de données sous-jacent par Int32.

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

Voir aussi