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—@stableenum requires an explicit discriminant on every variant.TE118— discriminant must be an integer constant.- /docs/data-structures#enums — numeric enum discriminants.