Mike Fielden
Mike Fielden

Reputation: 10153

C# switch: case not falling through to other cases limitation

This question is kind of an add-on to this question

In C#, a switch case cannot fall through to other cases, this causes a compilation error. In this case I am just adding some number to the month total for the selected month and each subsequent month thereafter. (simple example, not meant to be real)

switch (month)
{
    case 0:
      add something to month totals
    case 1:
      add something to month totals
    case 2:
      add something to month totals
    default:
      break;
}

Is there a logical alternative to this in C# without having to write out a ton of if statements?

if (month <= 0)
   add something to month
if (month <= 1)
   add something to month
if (month <= 2)
   add something to month
.... etc

Upvotes: 5

Views: 11953

Answers (5)

svv
svv

Reputation: 1

Write the switch cases in reverse order

case 2:

case 1:

case 0:

break;


default:

Hope that helps!

Upvotes: 0

jwarzech
jwarzech

Reputation: 6665

In C# switch statements you can fall through cases only if there is no statement for the case you want to fall through

switch(myVar)
{
   case 1:
   case 2: // Case 1 or 2 get here
      break;
}

However if you want to fall through with a statement you must use the dreaded GOTO

switch(myVar)
    {
       case 1: // Case 1 statement
               goto case 2;
       case 2: // Case 1 or 2 get here
          break;
    }

Upvotes: 8

Brian Warshaw
Brian Warshaw

Reputation: 22984

There is already a question addressing this topic:

C# switch statement limitations - why?

EDIT:

My main purpose in pointing that out, gentlebeasts, is that two questions of near-identical name add confusion to the pool of questions.

Upvotes: 1

Adam Davis
Adam Davis

Reputation: 93655

Are you adding constants? If so, maybe something like this would work(C syntax):

const int addToTotals[] = {123, 456, ..., 789};

for(i=month;i<12;i++)
   totals += addToTotals[i];

You can do a similar thing with variable or function pointers if you need more complex statements than add constant to totals for each month following.

-Adam

Upvotes: 1

Ben Scheirman
Ben Scheirman

Reputation: 41001

Often times when you see the noise from a huge switch statement or many if statements that might fall into more than one block, you're trying to suppress a bad design.

Instead, what if you implemented the Specification pattern to see if something matched, and then act on it?

foreach(MonthSpecification spec in this.MonthSpecifications)
{
   if(spec.IsSatisfiedBy(month))
       spec.Perform(month);
}

then you can just add up different specs that match what you're trying to do.

It's hard to tell what your domain is, so my example might be a little contrived.

Upvotes: 11

Related Questions