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