Conversion de int en enum en C# : 5 erreurs fatales et comment les éviter

Formateur Python en ligne pour débutants

Apprenez Python facilement sans surcharge théorique. Résolvez des tâches pratiques avec vérification automatique et écrivez du code directement dans le navigateur.

Start Course

Conversion de int en enum en C# : pourquoi cela casse le code et comment le réparer correctement

\n\n

Chaque développeur C#, même avec seulement quelques mois d'expérience, se retrouve tôt ou tard confronté à la question : « How do I cast int to enum in C#? ». Cette requête sur Stack Overflow a accumulé des centaines de milliers de vues — et pour cause. Quoi de plus simple, apparemment ? Écrire (MyEnum)myInt — et le tour est joué. Mais le diable se cache dans les détails. Une conversion incorrecte de int en enum peut entraîner des exceptions, des bugs difficiles à détecter, voire un crash du serveur de production.

\n\n

Dans cet article, nous allons analyser le top 5 des erreurs lors du cast de int en enum, montrer des exemples fonctionnels en C# et fournir un algorithme clair pour une conversion sécurisée. Si vous codez en C# et utilisez des énumérations, ces informations vous feront gagner des heures de débogage.

\n\n

Erreur n°1 : Conversion naïve sans vérification — « Et si le nombre n'est pas valide ? »

\n\n

La méthode la plus courante que les débutants trouvent sur Internet est le cast direct :

\n\n
enum Status\n{\n    Active = 1,\n    Inactive = 2,\n    Pending = 3\n}\n\nint input = 5; // L'utilisateur a envoyé quelque chose d'incorrect\nStatus status = (Status)input; // Pas d'erreur, mais status == (Status)5\nConsole.WriteLine(status); // Affichage : 5 — une valeur indésirable !\n
\n\n

Le code se compile et s'exécute sans exception. Mais la variable status contient désormais la valeur 5, qui n'existe pas dans l'enum Status. En C#, les énumérations sont, en substance, des entiers avec des noms. Le compilateur ne vérifie pas si la valeur appartient à l'ensemble des constantes. C'est un piège classique : la conversion de int en enum fonctionne techniquement, mais logiquement, c'est un bug.

\n\n

Comment l'éviter : utilisez toujours la méthode Enum.IsDefined() avant le cast.

\n\n
if (Enum.IsDefined(typeof(Status), input))\n{\n    Status status = (Status)input;\n}\nelse\n{\n    // Gestion de l'erreur : journalisation, valeur par défaut ou exception\n    Console.WriteLine($"Valeur {input} non valide pour Status");\n}\n
\n\n

Rappelez-vous : Enum.IsDefined() est lent en cas d'appels fréquents, mais pour des opérations ponctuelles, c'est un gardien idéal.

\n\n

Erreur n°2 : Ignorer les énumérations de drapeaux ([Flags])

\n\n

Lorsque vous travaillez avec des énumérations marquées par l'attribut [Flags], la logique de vérification change. Enum.IsDefined() retournera false pour les combinaisons de drapeaux, même si elles sont valides.

\n\n
[Flags]\nenum Permissions\n{\n    None = 0,\n    Read = 1,\n    Write = 2,\n    Execute = 4\n}\n\nint input = 3; // Read + Write\nif (Enum.IsDefined(typeof(Permissions), input))\n{\n    // Cela ne s'exécutera pas ! 3 n'est pas une constante individuelle\n}\n
\n\n

Pour les drapeaux, vous devez utiliser une autre vérification : tous les bits du nombre correspondent-ils à des valeurs définies ?

\n\n
bool IsValidFlags<T>(int value) where T : Enum\n{\n    int allValues = 0;\n    foreach (var v in Enum.GetValues<T>())\n    {\n        allValues |= Convert.ToInt32(v);\n    }\n    return (value & ~allValues) == 0;\n}\n\nif (IsValidFlags<Permissions>(input))\n{\n    Permissions perms = (Permissions)input; // Sécurisé\n}\n
\n\n

Ou, plus simplement, utilisez la vérification intégrée Enum.IsDefined() pour chaque drapeau individuel, s'ils sont peu nombreux.

\n\n

Erreur n°3 : Oubli de la gestion des nombres négatifs et des débordements

\n\n

L'enum en C# est basé par défaut sur int, mais peut être byte, short, long, etc. Si vous convertissez un int en enum, et que le type sous-jacent est byte, vous risquez une exception en cas de débordement ou, pire, une altération silencieuse de la valeur.

\n\n
enum SmallEnum : byte\n{\n    A = 0,\n    B = 255\n}\n\nint bigValue = 300;\nSmallEnum se = (SmallEnum)bigValue; // Erreur de compilation ? Non !\n// Mais la valeur sera tronquée : se == (SmallEnum)44 (300 % 256)\n

                
                

Blogs

Book Recommendations