Why does a switch expression require a default case in EK9?

← Control Flow · Ref: Q788

When switch is used as an EXPRESSION (capturing its result), every possible input must produce a value. A missing default means some inputs have no result — the compiler rejects this.

SWITCH EXPRESSION (requires default)

  label <- switch category
    <- rtn as String: String()
    case "A"
      rtn: "Alpha"
    default
      rtn: "Unknown"

SWITCH STATEMENT (also requires default, E07320)

  switch category
    case "A"
      stdout.println("Alpha")
    default
      stdout.println("Other")

ENUMERATED TYPES: NO EXCEPTION

A switch on an enumeration needs a default too, even when its cases list every value: the value switched on may be UNSET, and the default is what handles that (E07320 for a statement, E07330 for an expression). An enumeration switch must ALSO cover every value with its cases (E07310), so the default cannot stand in for a forgotten value.

THIS EXAMPLE

The describe() function uses switch as expression with a default case. The mutation removes the default.

See Q63 for switch basics. See Q73 for exhaustive enum switch. See Q782 for switch expressions.

Example

defines module qa.controlflow.switchdefault

  defines function

    describe() as pure
      -> category as String
      <- label as String?

      label: switch category
        <- rtn as String: String()
        case "A"
          rtn: "Alpha"
        case "B"
          rtn: "Beta"
        case "C"
          rtn: "Gamma"
        default
          rtn: "unknown category"

  defines program

    ShowCategories()
      stdout <- Stdout()
      stdout.println(describe("A"))
      stdout.println(describe("Z"))

Common mistakes

E07330 — A switch expression must handle all possible inputs. Without a default case, some values of category would produce no result. Add a default case to handle unmatched values. See ek9 -h E07330 for details.

Incorrect:

        //no default case

Correct:

        default
          rtn: "unknown category"
Other ways to ask this
  • What triggers E07330 default required in switch expression?
  • Why must switch expressions be exhaustive in EK9?
  • How do I add a default case to a switch expression?

Coming from another language?

Java: switch expressions (14+) require exhaustive coverage or default. Python: match/case has no exhaustiveness check. Rust: match must be exhaustive (compiler enforced). Kotlin: when used as expression must be exhaustive. Go: switch statement only, no expression form. EK9: every switch, statement or expression, enum or not, requires a default (E07320/E07330), because the value may be unset; an enum switch must also cover every value (E07310).

Keywords: required, case, default, E07330, switch, missing, expression, exhaustive