427 Stimmen

Switch-Anweisung fallthrough in C#?

Das Durchfallen von Schaltanweisungen ist einer der Hauptgründe, warum ich persönlich die switch vs. if/else if Konstrukte. Ein Beispiel ist hier angebracht:

static string NumberToWords(int number)
{
    string[] numbers = new string[] 
        { "", "one", "two", "three", "four", "five", 
          "six", "seven", "eight", "nine" };
    string[] tens = new string[] 
        { "", "", "twenty", "thirty", "forty", "fifty", 
          "sixty", "seventy", "eighty", "ninety" };
    string[] teens = new string[]
        { "ten", "eleven", "twelve", "thirteen", "fourteen", "fifteen",
          "sixteen", "seventeen", "eighteen", "nineteen" };

    string ans = "";
    switch (number.ToString().Length)
    {
        case 3:
            ans += string.Format("{0} hundred and ", numbers[number / 100]);
        case 2:
            int t = (number / 10) % 10;
            if (t == 1)
            {
                ans += teens[number % 10];
                break;
            }
            else if (t > 1)
                ans += string.Format("{0}-", tens[t]);
        case 1:
            int o = number % 10;
            ans += numbers[o];

            break;
        default:
            throw new ArgumentException("number");
    }
    return ans;
}

Die klugen Leute schrecken zurück, weil die string[] s sollten außerhalb der Funktion deklariert werden: Nun, sie sind es, dies ist nur ein Beispiel.

Der Compiler schlägt mit dem folgenden Fehler fehl:

Control cannot fall through from one case label ('case 3:') to another
Control cannot fall through from one case label ('case 2:') to another

Warum? Und gibt es eine Möglichkeit, diese Art von Verhalten zu erreichen, ohne dass man drei if s?

-1voto

Dai Tran Punkte 41

Sie können wie in C++ mit dem Schlüsselwort goto einen Durchlauf erreichen.

EX:

switch(num)
{
   case 1:
      goto case 3;
   case 2:
      goto case 3;
   case 3:
      //do something
      break;
   case 4:
      //do something else
      break;
   case default:
      break;
}

-1voto

Nur eine kurze Anmerkung, um hinzuzufügen, dass der Compiler für Xamarin tatsächlich bekam dies falsch und es erlaubt Fallthrough. Es wurde angeblich behoben, aber noch nicht veröffentlicht worden. Entdeckte dies in einigen Code, der tatsächlich fiel durch und der Compiler hat nicht beschweren.

-12voto

Marcus Punkte 1097

Sie haben vergessen, die Anweisung "break;" in case 3 einzufügen. Im Fall 2 haben Sie sie in den if-Block geschrieben. Versuchen Sie daher Folgendes:

case 3:            
{
    ans += string.Format("{0} hundred and ", numbers[number / 100]);
    break;
}

case 2:            
{
    int t = (number / 10) % 10;            
    if (t == 1)            
    {                
        ans += teens[number % 10];                
    }            
    else if (t > 1)                
    {
        ans += string.Format("{0}-", tens[t]);        
    }
    break;
}

case 1:            
{
    int o = number % 10;            
    ans += numbers[o];            
    break;        
}

default:            
{
    throw new ArgumentException("number");
}

CodeJaeger.com

CodeJaeger ist eine Gemeinschaft für Programmierer, die täglich Hilfe erhalten..
Wir haben viele Inhalte, und Sie können auch Ihre eigenen Fragen stellen oder die Fragen anderer Leute lösen.

Powered by:

X