Warum steht beim C# mit switch Case "Konstanten erwartet" als Fehlermeldung?
Hallo.
Also ich versuche gerade das, was sie auf dem Bild sehen.
Also die M1, M2, M3, M4 sind eine String Variable, und ich wollte es so machen falls Wächter1 genau die gleiche Zahl hat wie M1 oder M4 z. B. dann muss er das hier ausführen. Aber der case mag die Variable nicht und steht "Konstanzenwert erwartet" als fehlermeldung. Kann mir jemand helfen wie ich dieses Problem beheben kann?
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.
Stimmt ich kann selbst mit const String dann nicht damit verändern, und somit bringt mir das auch nichts.
Wenn du keine Konstanten verwenden möchtest (und if-elseif ja auch nicht), schau, ob du es mit Schleifen lösen kannst.
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.
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.
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.
Weil swithch konstanten erwartet. Statdessen kannst du else if nehmen.
Ja ich will aber kein else if machen, weil das dann (auf grund wegen diese Projekt) sehr aufwendig wird.
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()
{
}
}
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.
Haben const String keine Nachteile dafür?