Saltar al contenido
TE114 · Tipos · error

Un enum con discriminantes numéricos no puede ser genérico

Un enum optó por discriminantes numéricos (tipo de respaldo, o un `= n` explícito) pero es genérico o tiene una variante con payload. Los discriminantes solo tienen sentido para enums planos, con todas las variantes unitarias.

Why this fires

An enum opts into numeric discriminants (it declares a backing type, e.g. enum E: u8 { ... }, or any variant has an explicit = n), but it is generic or has a variant that carries a payload. Numeric discriminants only make sense for a flat, all-unit-variant enum — there's no single integer that could represent Circle(float)'s payload.

enum Packet: u8 {
    Connect,
    Data(str),
    //   ^^^ error[TE114]: variant `Packet::Data` has a payload, so enum `Packet`
    //       cannot use numeric discriminants (only all-unit enums can)
}

Fix it

1. Drop the payload

enum Packet: u8 {
    Connect,
    Data,                    // ok — unit variant
}

2. Drop the backing type

If the payload is essential, don't opt into numeric discriminants — leave the enum untyped:

enum Packet {
    Connect,
    Data(str),               // ok — no backing type, no discriminant machinery
}

See also

  • TE115 — a discriminant value doesn't fit the backing type.
  • TE116 — duplicate discriminant value.
  • TE117@stable enum requires an explicit discriminant on every variant.
  • TE118 — discriminant must be an integer constant.
  • /docs/data-structures#enums — numeric enum discriminants.

Véase también

Buscar en Zolo

9 resultados

en