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