Question

I'm getting strange results testing the return value from a function. This code is inside a for loop:

DialogResult result = EvalReturnFromWS(returnMsg);
     switch (result)
     {
         case DialogResult.Yes:
         case DialogResult.No:
              continue;
         default:
              break;
     } 

Here is a snippet from the called function (in my unit testing I always click the "yes" button):

DialogResult result = MessageBox.Show(mbText.ToString(), caption, button, icon);
switch (result)
    {
         case DialogResult.Yes:
              return DialogResult.Yes;
         case DialogResult.No:
              return DialogResult.No;
         case DialogResult.Cancel:
              return DialogResult.Cancel;
    }

When I click "Yes" it returns DialogResult.Yes but back in the calling code, execution flows to the 2nd case which is "no" and this does a continue which is what I do NOT intend.

Elsewhere on StackOverflow, I saw a thread that suggesting coding a "fall-through" case like I have for DialogResult.Yes would serve to fall through.

In short, if YES, I want to resume execution with the next statement after the end of the switch case(s). That is, "fall through".

EDIT - sorry for confusion. Yes, the top snippet is inside a for loop. The 2nd snippet is inside the called function (that code issues MessageBox.Show).

Was it helpful?

Solution

What you want to do is put break; in the DialogResult.Yes case. You don't want it to fall through in this case.

 switch (result)
 {
     case DialogResult.Yes:
          break; //Leaves the switch statement and continues executing code
     case DialogResult.No:
          continue; //Moves to next iteration of loop
     default:
          break; //Leaves the switch statement and continues executing code
 }

Fall through means that execution moves from one case statement to the next one. It has nothing to do with execution leaving the switch statement. In your example, the break; under default:, breaks out of that block of code (the switch, not the loop) and continues execution after the switch statement. Again, it does NOT break out of the outer loop. This is because break; is a keyword within switch cases that stops further execution of the switch case block. However, continue; will continue the loop because it's not something used within a switch case.

Try running this example code:

for (int i = 0; i < 3; i++) {
    switch (i) {
        case 0:
        case 2:
            continue;
        default:
            break;
    }
    Console.Out.WriteLine(i);
}

It will only output 1 because for the cases i=0 and i=2, the loop is continued. For case i=1 execution makes it to Console.Out.WriteLine(i);.

Edit
And, if you want to break out of the loop from within your switch, see this question: Breaking out of a nested loop

OTHER TIPS

Is this in a loop? That's the only reason I can see you using 'continue' after No. Sure enough, by stacking the case options that way Yes and No will do the same thing. If you want 'Yes' to just 'fall thru' after the switch do this

case DialogResult.Yes:
    break;
Licensed under: CC-BY-SA with attribution
Not affiliated with StackOverflow
scroll top