wake-up-neo.com

Warum funktioniert eine if-Anweisung, aber keine switch-Anweisung?

Ich versuche, eine switch -Anweisung mit dem Zeichenindex einer Zeichenfolge und einer Aufzählung mit this Wrapper zu erstellen, um den Wert der ausgewählten Aufzählung aus einer Beschreibung abzurufen. Es erlaubt Ihnen ziemlich genau, eine Zeichenkette unter einem Aufzählungswert zu speichern.

Hier ist meine if Anweisung:

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

und hier ist meine switch Anweisung:

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

Warum akzeptiert es die Anweisung if und nicht die Anweisung switch? Ich habe versucht, es in ein Zeichen umzuwandeln, da ich einen Index aus einem String auswähle, aber leider hat es nicht funktioniert.

Update:

Hier ist die Message.Code Aufzählung

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

Wie Sie sehen, muss die Beschreibung der Aufzählung zugewiesen werden, nicht der Aufzählungswert 0. Wenn Sie Message.Code.FOO_TRIGGER_SIGNAL.EnumDescriptionToString() aus dem erwähnten Wrapper verwenden, wird A not 0 Zurückgegeben.


Error:

Ein konstanter Wert wird erwartet

39
AndrewE

Sie können keine Ausdrücke in der Groß-/Kleinschreibung haben (vor C # 7), aber Sie können in der Umschaltung, so dass dies funktioniert:

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

Wo Sie ConvertToMessageCode schreiben müssen, um die notwendige Konvertierung in das Message.Code enum. ConvertToMessageCode abstrahiert nur die Konvertierungsdetails. Möglicherweise benötigen Sie keine separate Methode, können aber mit Inline-Code in der switch-Anweisung, z. B. einer Besetzung, auskommen.

53
Polyfun

Ein case in einer switchAnweisung muss sich auf einen konstanten Wert beziehen. Sie können einen Ausdruck in einem case nicht auswerten.

27
Code-Apprentice

Dies ist wirklich keine gute Antwort, da es nur zur Ausarbeitung früherer Antworten dient. Akzeptiere es nicht (bitte stimme auch keiner vernünftigen Antwort zu). Ich schreibe es nur als Antwort, da ein Kommentar nicht zu dieser Erklärung passt.


Du versuchtest:

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

Dies funktioniert nicht, da der Fall nicht konstant ist. Wie vorgeschlagen, ist der beste Weg, das msgComingFromFoo[1] String zurück auf einen Enum-Wert, damit Sie die Enum-Konstanten in den Switch-Fällen verwenden können.

Wenn das irgendwie nicht möglich ist, können Sie jederzeit String-Konstanten umschalten. Dies ist jedoch fehleranfällig und vereitelt den Zweck der Verwendung von Aufzählungen an erster Stelle.

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

Noch eine Bemerkung: Denken Sie daran, dass Arrays null-indiziert sind. Sie schalten gerade das zweite Element um, nicht das erste. Verwenden msgComingFromFoo[0] für das erste Element.

6
Jochem Kuijpers

Zur Antwort von @ code-apprentice hinzufügen.

Wenn Sie feststellen, dass die if -Anweisung zu lang wird oder mehrere Bedingungen in if else Enthalten sind. Sie können den Code überarbeiten und Ihre Logik in ein Objekt einbetten und anhand des Besuchermusters die auszuführende Arbeit steuern.

So etwas wie:

public interface IMessageLogic 
{
   void ProcessMessage()
}

public class TriggerSignal : IMessageLogic 
{
   public void ProcessMessage() 
   {
       // Do trigger 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);
 }

Besuchermuster

5
Victor Procure