# V3139. Two or more case-branches perform the same actions.

The analyzer has detected a switch statement whose different case labels contain the same code. This is often a sign of redundant code, which could be improved by merging the labels. However, identical code fragments may also result from copy-paste programming, in which case they are genuine errors.

The following example illustrates the redundant code scenario:

    switch (switcher)
    {
      case 0: Console.Write("0"); return;
      case 1: Console.Write("0"); return;
      default: Console.Write("default"); return;
    }

Indeed, different values of 'switcher' may require performing the same actions, so the code can be rewritten in a more concise form:

    switch (switcher)
    {
      case 0:
      case 1: Console.Write("0"); return;
      default: Console.Write("default"); return;
    }

If you use the case expressions, you won't be able to group such expressions under one condition.

    private static void ShowCollectionInformation(object coll, bool cond)
    {
      switch (coll)
      {
        case Array arr:
          if(cond)
          {
            Console.WriteLine (arr.ToString());
          }
          break;
        case IEnumerable<int> arr:
          if(cond)
          {
            Console.WriteLine (arr.ToString());
          }
          break;
       }
    }

You can, however, move the code into a separate method, which will make it easier to modify and debug this code in the future.

Now, the following real-life example demonstrates a programming mistake:

    switch (status.BuildStatus)
    {
      case IntegrationStatus.Success:
        snapshot.Status = ItemBuildStatus.CompletedSuccess;
        break;
      case IntegrationStatus.Exception:
      case IntegrationStatus.Failure:
        snapshot.Status = ItemBuildStatus.CompletedSuccess;
        break;
    }

The status assignment is faulty: the 'ItemBuildStatus' enumeration has the element 'CompletedFailed', which was to be assigned in case of failure or exception.

Fixed code:

    switch (status.BuildStatus)
    {
      case IntegrationStatus.Success:
        snapshot.Status = ItemBuildStatus.CompletedSuccess;
        break;
      case IntegrationStatus.Exception:
      case IntegrationStatus.Failure:
        snapshot.Status = ItemBuildStatus. CompletedFailed;
        break;
    }

You can look at examples of errors detected by the V3139 diagnostic.