Humanizr/Humanizer · error · ArgumentOutOfRangeException
Unsupported grammatical case.
Error message
Unsupported grammatical case.
What it means
Thrown by ValidateGrammaticalCase when the GrammaticalCase enum value cast from an integer is outside the defined range (0 through Causal). This guards against undefined enum values produced by casting arbitrary integers or deserialization of invalid enum data.
Source
Thrown at src/Humanizer/TimeSpanHumanizeExtensions.cs:963
}
return grammaticalCase is null && toWords && !toSymbols
? cultureFormatter.TimeSpanHumanize_Zero()
: FormatTimePart(
cultureFormatter,
minUnit,
0,
culture,
toWords,
toSymbols,
grammaticalCase);
}
static void ValidateGrammaticalCase(GrammaticalCase grammaticalCase)
{
if ((uint)grammaticalCase > (uint)GrammaticalCase.Causal)
{
throw new ArgumentOutOfRangeException(nameof(grammaticalCase), grammaticalCase, "Unsupported grammatical case.");
}
}
static string ConcatenateTimeSpanParts(List<string> timeSpanParts, CultureInfo? culture, string? collectionSeparator)
{
if (collectionSeparator == null)
{
return Configurator
.CollectionFormatters.ResolveForCulture(culture)
.Humanize(timeSpanParts);
}
return string.Join(collectionSeparator, timeSpanParts);
}
}View on GitHub (pinned to ffc2b77c0f)
Solutions
- Validate the GrammaticalCase with Enum.IsDefined before passing it.
- Use only named GrammaticalCase constants.
- Default to GrammaticalCase.Nominative when the value is undefined.
Example fix
// before
var gc = (GrammaticalCase)userValue;
var s = ts.HumanizeWithCase(gc, precision: 3);
// after
var gc = Enum.IsDefined(typeof(GrammaticalCase), userValue)
? (GrammaticalCase)userValue
: GrammaticalCase.Nominative;
var s = ts.HumanizeWithCase(gc, precision: 3); Defensive patterns
Strategy: validation
Validate before calling
static bool IsValidGrammaticalCase(GrammaticalCase gc) =>
(uint)gc <= (uint)GrammaticalCase.Causal; Type guard
static GrammaticalCase SafeGrammaticalCase(int value) =>
Enum.IsDefined(typeof(GrammaticalCase), value)
? (GrammaticalCase)value
: GrammaticalCase.Nominative; Prevention
- Always use named GrammaticalCase constants, never integer casts.
- Use Enum.IsDefined to validate deserialized enum values.
- Default to Nominative for invalid inputs.
When it happens
Trigger: Casting an arbitrary integer to GrammaticalCase, e.g. (GrammaticalCase)999, and passing it to HumanizeWithCase. Also from deserializing JSON or config with an out-of-range case number.
Common situations: Enum value sourced from user input or external data without validation. Numeric cast from a database column. Serialization/deserialization round-trip that produced an invalid value.
Related errors
- Culture '{Culture.Name}' does not support grammatical case '
- The configured ITimeSpanHumanizeStrategy does not support gr
- Fractional seconds support only midpoint rounding ToEven and
- Grammatical case is not supported for time-unit symbols.
- The formatter for '{culture?.Name ?? CultureInfo.CurrentCult
AI-assisted analysis of Humanizr/Humanizer@ffc2b77c0f (2026-08-13).
Data as JSON: /api/errors/c9f532e382cbb068.
Report an issue: GitHub.