39 votes

Pourquoi une instruction si fonctionne-t-elle mais pas une instruction de commutateur

Je suis en train de créer un switch déclaration à l'aide de l'indice de char d'une chaîne et d'un Enum à l'aide de ce wrapper pour obtenir la valeur de la sélection enum à partir d'une Description. Il vous permet de stocker une chaîne de caractères à une valeur d'enum.

Voici mon if déclaration:

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

et voici mon switch déclaration:

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

Pourquoi est-il accepter l' if déclaration et de ne pas l' switch? J'ai essayé de le convertir à un char depuis que je suis la sélection d'un index à partir d'une chaîne de caractères, mais malheureusement il ne fonctionne pas.

Mise à jour:

Voici l' Message.Code Enum

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

Comme vous pouvez le voir, j'ai besoin de la Description affecté à l'enum pas la valeur d'enum qui est de 0. À l'aide de Message.Code.FOO_TRIGGER_SIGNAL.EnumDescriptionToString() de la mentionnée wrapper retours A pas 0


Erreur:

Une Valeur Constante Qui Est Attendu

54voto

ShellShock Points 4268

Vous ne pouvez pas avoir d’expressions dans le cas (avant C '7), mais vous pouvez dans le commutateur, de sorte que cela fonctionnera:

Lorsque vous devrez écrire `` pour effectuer la conversion nécessaire à l’enum. il suffit d’abstractions les détails de ```` conversion, vous pouvez trouver que vous n’avez pas besoin d’une méthode distincte, mais peut faire avec le code en ligne dans l’instruction de commutateur, par exemple, un casting.

27voto

Code-Apprentice Points 18086

A dans une déclaration doit se référer à une valeur constante. Vous ne pouvez pas évaluer une expression dans un `` .

6voto

Jochem Kuijpers Points 1483

C'est vraiment pas une bonne réponse car il ne sert que d'élaboration sur les réponses précédentes. Ne l'accepte pas (merci de ne pas upvote au-dessus de toute réponse raisonnable). Je vais écrire une réponse depuis seulement un commentaire ne correspondent pas à cette explication.


Vous avez essayé:

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

Cela ne fonctionne pas car l'affaire n'est pas constante. Comme l'a suggéré, la meilleure façon de progresser est de convertir l' msgComingFromFoo[1] chaîne de retour à une valeur d'énumération de sorte que vous pouvez passer plus de l'énumération et de l'utilisation de l'enum constantes dans le commutateur cas.

Si c'est de toute façon pas possible, vous pouvez toujours passer des constantes de chaîne. Cependant, ce qui est source d'erreurs et de défaites le but de l'utilisation des enums en premier lieu..

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

Une autre remarque: rappelez-vous que les piles sont zéro-indexé. Vous êtes en train de basculer le deuxième élément, pas le premier. Utiliser msgComingFromFoo[0] pour le premier élément.

5voto

Victor Procure Points 778

Pour ajouter à la réponse de @code-apprenti.

Si vous trouvez la déclaration devient trop long ou a de multiples conditions au sein de 's. Vous pouvez envisager de refactoriser le code et d’encapsuler votre logique dans un objet et d’utiliser le modèle de visiteur pour contrôler le travail à faire.

Quelque chose comme:

Modèle de visiteur

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X