C#: Workaround for Illegal Switch Statement?

Possible Duplicate:
Switch statement fallthrough in C#?

The following code is illegal in C# because control cannot fall through from one case label to another. However, this behaviour is perfectly legal in C++. So, how would you go about coding the same behaviour in C#?

enum TotalWords
{
   One = 1,
   Two,
   Three,
   Four
}

public String SomeMethod(TotalWords totalWords)
{     
     String phrase = "";

     switch (totalWords)
     {
        case TotalWords.Four:
             phrase = "Fox" + phrase;
        case TotalWords.Three:
             phrase = "Brown" + phrase;
        case TotalWords.Two:
             phrase = "Quick" + phrase;
        case TotalWords.One:
             phrase = "The" + phrase;
             break;

        default:
             break;
     }

     return phrase;
}

Eric Lippert, who works on the language, talks about it here:
http://ericlippert.com/2009/08/13/four-switch-oddities/

Short version: the easiest fix is to use a goto:

switch (totalWords)
 {
    case TotalWords.Four:
         phrase = "Fox" + phrase;
         goto case TotalWords.Three;
    case TotalWords.Three:
         phrase = "Brown" + phrase;
         goto case TotalWords.Two;
    case TotalWords.Two:
         phrase = "Quick" + phrase;
         goto case TotalWords.One;
    case TotalWords.One:
         phrase = "The" + phrase;
         break;

    default:
         break;
 }

I think the rationale here is that 9 times out of 10 a missing break is a bug rather than intentional. Forcing you to use break and an explicit branch helps keep you from writing bugs and makes it clear to future maintainters that the fall-through is intentional.


Given that this is a numeric enumeration, and you're doing essentially the same operation in all cases, you can re-write it as a loop:

String[] phrase_bits = new String[] { "The", "Quick", "Brown", "Fox" };

public String SomeMethod(TotalWords totalWords)
{
    int x = (int) totalWords;
    String phrase = ""
    while (--x >= 0) {
        phrase = phrase_bits[x] + phrase
    }
    return phrase
}

This is not a generic answer for all switch statements, but for this case it's fairly nice.

链接地址: http://www.djcxy.com/p/84480.html

上一篇: 按预期切换失败

下一篇: C#:非法交换声明的解决方法?