Conversion de int en enum en C# : pourquoi cela casse le code et comment le réparer correctement
\n\nChaque 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.
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\nErreur n°1 : Conversion naïve sans vérification — « Et si le nombre n'est pas valide ? »
\n\nLa méthode la plus courante que les débutants trouvent sur Internet est le cast direct :
\n\nenum 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\nLe 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.
Comment l'éviter : utilisez toujours la méthode Enum.IsDefined() avant le cast.
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\nRappelez-vous : Enum.IsDefined() est lent en cas d'appels fréquents, mais pour des opérations ponctuelles, c'est un gardien idéal.
Erreur n°2 : Ignorer les énumérations de drapeaux ([Flags])
\n\nLorsque 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.
[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\nPour les drapeaux, vous devez utiliser une autre vérification : tous les bits du nombre correspondent-ils à des valeurs définies ?
\n\nbool 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\nOu, plus simplement, utilisez la vérification intégrée Enum.IsDefined() pour chaque drapeau individuel, s'ils sont peu nombreux.
Erreur n°3 : Oubli de la gestion des nombres négatifs et des débordements
\n\nL'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.
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
Lire aussi
Envoyer HTTP POST en .NET : du débutant au pro avec C#
Structures en C++ : différence entre struct et typedef struct — explication pour débutants
Microservices en C++ : par où commencer en 2024
WebSocket en Swift : créer des applications temps réel pour iOS et macOS
Indexation des chaînes en Rust : 5 erreurs fatales et comment les éviter