bchavez/Bogus · error · ArgumentOutOfRangeException

Gender not handled.

Error message

Gender not handled.

What it means

ExtensionsForSweden.GetGenderNumber only handles Gender.Male and Gender.Female; any other value throws ArgumentOutOfRangeException. The Name.Gender enum defines only those two members, so under normal strongly-typed use this guard is unreachable - it is a defensive fallback for an enum value supplied via an invalid cast.

Source

Thrown at Source/Bogus/Extensions/Sweden/ExtensionsForSweden.cs:96

      return individualNumber;
   }

   private static string GenerateIndividualNumber(Randomizer r, Gender gender, DateTime dateOfBirth, int dayOffset = 0)
   {
      var genderNumber = GetGenderNumber(r, gender);
      var offsetDay = dateOfBirth.Day + dayOffset;
      var p = dateOfBirth.ToString("yyyyMM") + offsetDay.ToString("00") + dateOfBirth.ToString("ff") + genderNumber;
      var checksum = GetLuhn(p.Substring(2));
      return p + checksum;
   }

   private static int GetGenderNumber(Randomizer r, Gender gender)
   {
      if( gender is Gender.Male )
         return r.Odd(1, 9);
      if( gender is Gender.Female )
         return r.Even(1, 9);
      throw new ArgumentOutOfRangeException(nameof(gender), gender, "Gender not handled.");
   }

   private static int GetLuhn(string value)
   {
      // Luhn algorithm doubles every other number in the value.
      // To get the correct checksum digit we aught to append a 0 on the sequence.
      // If the result becomes a two digit number, subtract 9 from the value.
      // If the total sum is not a 0, the last checksum value should be subtracted from 10.
      // The resulting value is the check value that we use as control number.

      // The value passed is a string, so we aught to get the actual integer value from each char (i.e., subtract '0' which is 48).
      var t = value.ToCharArray().Select(d => d - 48).ToArray();
      var sum = 0;
      int temp;
      for (var i = 0; i < t.Length; i++)
      {
         temp = t[i];
         temp *= 2 - (i % 2);

View on GitHub (pinned to 6ece18c5c2)

Solutions

  1. Only use Name.Gender.Male or Name.Gender.Female.
  2. If gender comes from an int, validate Enum.IsDefined(typeof(Name.Gender), value) before assigning Person.Gender.
  3. Let Bogus assign gender by default rather than overriding it.

Example fix

// before
person.Gender = (Name.Gender)5;
var pn = person.Personnummer();

// after
person.Gender = Enum.IsDefined(typeof(Name.Gender), incoming)
    ? (Name.Gender)incoming
    : Name.Gender.Male;
var pn = person.Personnummer();
Defensive patterns

Strategy: validation

Validate before calling

if (!Enum.IsDefined(typeof(Name.Gender), person.Gender))
    throw new ArgumentOutOfRangeException(nameof(person.Gender));
var pn = person.Personnummer();

Type guard

static bool IsValid(Name.Gender g) => g == Name.Gender.Male || g == Name.Gender.Female;

Prevention

When it happens

Trigger: Calling person.Personnummer() or person.Samordningsnummer() on a Person whose Gender was set to a value produced by casting an out-of-range int to Name.Gender.

Common situations: Deserializing a numeric gender from config/API and casting it to Name.Gender without validation; values other than 0 (Male) and 1 (Female) reach this guard.

Related errors


AI-assisted analysis of bchavez/Bogus@6ece18c5c2 (2026-08-13). Data as JSON: /api/errors/eaddca04cddda759. Report an issue: GitHub.