C#: Workaround for Illegal Switch Statement? [duplicate]
Possible Duplicate:
Switch statement fallthrough in C#?
The following code is ille开发者_StackOverflow中文版gal 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.
精彩评论