Pourquoi une instruction if fonctionne-t-elle mais pas une instruction switch

J’essaie de créer une instruction switch utilisant l’index char d’une chaîne et un Enum utilisant ce wrapper pour obtenir la valeur de l’énumération sélectionnée à partir d’une description. Cela vous permet de stocker une chaîne à une valeur enum.

Voici ma déclaration if :

 if (msgComingFromFoo[1] == Convert.ToChar(Message.Code.FOO_TRIGGER_SIGNAL.EnumDescriptionToSsortingng())) { //foo } 

et voici ma déclaration de switch :

 switch (msgComingFromFoo[1]) { case Convert.ToChar(Message.Code.FOO_TRIGGER_SIGNAL.EnumDescriptionToSsortingng()): break; } 

Pourquoi accepte-t-il la déclaration if et non le switch ? J’ai essayé de le convertir en caractère car j’ai sélectionné un index dans une chaîne, mais malheureusement cela n’a pas fonctionné.

Mettre à jour:

Voici le Message.Code Enum

 public class Message { public enum Code { [Description("A")] FOO_TRIGGER_SIGNAL } } 

Comme vous pouvez le voir, j’ai besoin que la description atsortingbuée à l’énumération ne soit pas la valeur enum de 0. L’utilisation de Message.Code.FOO_TRIGGER_SIGNAL.EnumDescriptionToSsortingng() partir du wrapper mentionné renvoie A not 0

Erreur:

Une valeur constante est attendue

Vous ne pouvez pas avoir d’expressions dans le cas (avant C # 7), mais vous pouvez dans le commutateur, donc cela fonctionnera:

 switch (ConvertToMessageCode(msgComingFromFoo[1])) { case Message.Code.FOO_TRIGGER_SIGNAL: break; } 

Où vous aurez besoin d’écrire ConvertToMessageCode pour effectuer la conversion nécessaire dans le enum Message.Code . ConvertToMessageCode résume simplement les détails de la conversion, vous pouvez constater que vous n’avez pas besoin d’une méthode distincte, mais que vous pouvez vous débrouiller avec du code en ligne dans l’instruction switch, par exemple, une dissortingbution.

Un case dans une instruction switch doit faire référence à une valeur constante. Vous ne pouvez pas évaluer une expression dans un case .

Ce n’est vraiment pas une bonne réponse car elle ne sert que d’élaboration des réponses précédentes. Ne l’acceptez pas (s’il vous plait, ne prenez pas la moindre réponse raisonnable). Je l’écris comme une réponse seulement car un commentaire ne correspondra pas à cette explication.


Tu as essayé:

 switch (msgComingFromFoo[1]) { case Convert.ToChar(Message.Code.FOO_TRIGGER_SIGNAL.EnumDescriptionToSsortingng()): break; } 

Cela ne fonctionne pas car le cas n’est pas constant. Comme suggéré, la meilleure solution consiste à convertir la msgComingFromFoo[1] en une valeur enum afin de pouvoir basculer l’énum et utiliser les constantes enum dans les cas de commutateur.

Si cela n’est pas possible, vous pouvez toujours basculer les constantes de chaîne. Cependant, ceci est source d’erreurs et défait le but d’utiliser des enums en premier lieu.

 switch (msgComingFromFoo[1]) { case "A": break; } 

Une autre remarque: rappelez-vous que les tableaux sont indexés à zéro . Vous passez actuellement le deuxième élément, pas le premier. Utilisez msgComingFromFoo[0] pour le premier élément.

Ajouter à la réponse de @code-apprenti.

Si vous trouvez la déclaration if devient trop longue ou comporte plusieurs conditions, if else . Vous pouvez revoir le code et encapsuler votre logique dans un object et utiliser le modèle de visiteur pour contrôler le travail à effectuer.

Quelque chose comme:

 public interface IMessageLogic { void ProcessMessage() } public class TriggerSignal : IMessageLogic { public void ProcessMessage() { // Do sortinggger stuff } } public class FooMessage : IMessageLogic { public void ProcessMessage() { // Do foo stuff } } public class MessageHandler { public void HandleMessage(IMessageLogic messageLogic) { messageLogic.ProcessMessage(); } } public static void Main() { IMessageLogic messageLogic = GetMessage(); var handler = new MessageHandler(); handler.HandleMessage(messageLogic); } 

Motif de visiteur