Warum steht beim C# mit switch Case "Konstanten erwartet" als Fehlermeldung?

3 Antworten

Die Werte, die du je case zum Vergleichen setzt, dürfen nicht veränderbar sein. Deine String-Variablen sind es aber. Mache sie konstant oder schreibe stattdessen ihren konkreten Wert.

Beispiel:

const string someCase = "some case";

switch (someValue)
{
  case someCase:
    // ...
    break;
  case "some other case":
    // ...
    break;
}

Alternativen dazu können if-else oder Schleifen (mit innerer Überprüfung) sein.

PrincPersia 
Fragesteller
 27.11.2018, 19:02

Haben const String keine Nachteile dafür?

0
PrincPersia 
Fragesteller
 27.11.2018, 19:12
@regex9

Stimmt ich kann selbst mit const String dann nicht damit verändern, und somit bringt mir das auch nichts.

0
regex9  27.11.2018, 19:13
@PrincPersia

Wenn du keine Konstanten verwenden möchtest (und if-elseif ja auch nicht), schau, ob du es mit Schleifen lösen kannst.

1
regex9  27.11.2018, 19:17
@regex9

Ach ja, klar, kannst du - bzw. eine Schleife benötigst du nicht einmal. Stopfe String (M1-M4) und Objekt (R1-R4) paarweise in ein Dictionary. Danach kannst du über den Key Waechter1 (entferne den Umlaut!) schauen, ob der Key existiert und entsprechend handeln.

if (dict.ContainsKey(guard1))
{
  dict[guard1].Hide();
}

Oder du musst mal überlegen, wie du deine Struktur generell umstellst, so dass auch so eine Assoziation zwischen den Objekten vorgenommen werden kann.

1
Schachpapa  27.11.2018, 19:29
@PrincPersia

Wenn die Unveränderlichkeit ein Nachteil ist, dann ja. Aber dann kannst du eben kein switch verwenden sondern if. Aber das willst du ja auch nicht.

Humphrey Bogart lässt grüßen: Du musst dich entscheiden, Kleines.

0
Brainchild  27.11.2018, 20:51
@PrincPersia

Wenn du sicher bist, das sich ein String nie ändern wird, nimm lieber Konstanten. Warum sollten sie dann Nachteile haben? Sie haben sogar Vorteile: Du kannst sie nicht versehentlich ändern.

0

Weil swithch konstanten erwartet. Statdessen kannst du else if nehmen.

Woher ich das weiß:Berufserfahrung – Studium der Informatik + Softwareentwickler seit 25 Jahren.
PrincPersia 
Fragesteller
 27.11.2018, 19:00

Ja ich will aber kein else if machen, weil das dann (auf grund wegen diese Projekt) sehr aufwendig wird.

0
Brainchild  27.11.2018, 19:25

Alternaiv würde auch Linq/Lambda gehen.

0

Hier eine Methode mit Reflection und Invoke:

class Program
{
    static void Main(string[] args)
    {
        Test test = new Test();
        test.Verzweigung();
    }
}

class Test
{
    public void Verzweigung()
    {
        string[] fälle = { "A", "B", "C" };
        string[] methoden = { "TuWas1", "TuWas2", "TuWas3" };
        string fall = "B";

        int index = Array.FindIndex(fälle, f => f == fall);
        GetType().GetMethod(methoden[index]).Invoke(this, null);
    }

    public void TuWas1()
    {
    }

    public void TuWas2()
    {
    }

    public void TuWas3()
    {
    }
}
Woher ich das weiß:Berufserfahrung – Studium der Informatik + Softwareentwickler seit 25 Jahren.
regex9  27.11.2018, 21:13

Reflection wäre an dieser Stelle ziemlich überladen. Da könnte man stattdessen Delegates verwenden. Für das Problem des FS ist aber beides letzten Endes nicht notwendig.

0