== Why is this an issue?

The https://learn.microsoft.com/en-us/dotnet/csharp/language-reference/statements/selection-statements#the-switch-statement[switch statement] is a conditional statement that executes a sequence of instructions based on patterns matching the provided value.

[source,csharp]
----
switch (temperatureInCelsius)
{
    case < 35.0:
        Console.WriteLine("Hypothermia");
        break;
    case >= 36.5 and <= 37.5:
        Console.WriteLine("Normal");
        break;
    case > 37.5 and <= 40.0:
        Console.WriteLine("Fever or hyperthermia");
        break;        
    case > 40.0:
        Console.WriteLine("Hyperpyrexia");
        break;
}
----

The `switch` statement can optionally contain a `default` clause, executed when none of the `case` clauses are executed (or in presence of a `goto default;`).

[source,csharp]
----
switch (gradeLetter)
{
    case "A+":
    case "A":
    case "A-":
        Console.WriteLine("Excellent");
        break;
    case "B+":
    case "B":
        Console.WriteLine("Very Good");
        break;
    case "B-":
    case "C+":    
        Console.WriteLine("Good");
        break;        
    case "C":
        Console.WriteLine("Pass");
        break;
    case "F":
        Console.WriteLine("Fail");
        break;
    default:
        Console.WriteLine("Invalid grade letter!");
        break;
}
----

The `default` clause can be defined for various reasons:

* to handle *unexpected values*, as shown in the example above
* or to show that all the cases were properly considered, making the function explicitely *total* (as opposed to https://en.wikipedia.org/wiki/Partial_function[partial])

While C# allows the `default` clause to appear in any place within a `switch` statement, and while its position doesn't alter its behavior, it is recommended to put the `default` clause either at the beginning or at the end of the `switch` statement.

That improves readability and helps the developer to quickly find the default behavior of a `switch` statement.

This rule raises an issue if the `default` clause is neither the first nor the last one of the `switch` statement.

== How to fix it

=== Code examples

==== Noncompliant code example

[source,csharp,diff-id=1,diff-type=noncompliant]
----
switch (param) 
{
    case 0:
        DoSomething();
        break;
    default: // Noncompliant: default clause should be the first or last one
        Error();
        break;
    case 1:
        DoSomethingElse();
        break;
}
----

==== Compliant solution

[source,csharp,diff-id=1,diff-type=compliant]
----
switch (param) 
{
    case 0:
        DoSomething();
        break;
    case 1:
        DoSomethingElse();
        break;
    default:
        Error();
        break;
}
----

== Resources

=== Documentation

* https://learn.microsoft.com/en-us/dotnet/csharp/language-reference/statements/selection-statements#the-switch-statement[Switch statement]
* https://en.wikipedia.org/wiki/Partial_function[Partial function]

include::../rspecator.adoc[]
