W sytuacji, gdy nad danym projektem pracuje większa grupa programistów czasami trudno jest się wystrzec oczywistych błędów. Takim błędem jest zapominanie o domyślnej inicjalizacji zmiennych w przypadku enum-a. Poniżej przedstawiam bardzo prosty przykład:

public enum DzienTygodnia
{
  Poniedzialek = 1,
  Wtorek = 2,
  Sroda = 3,
  Czwartek = 4,
  Piatek = 5,
  Sobota = 6,
  Niedziela = 7
}

Oraz dwa wywołania:

DzienTygodnia dzien = new DzienTygodnia();
System.Console.Out.WriteLine("Dzien: " + dzien);
System.Console.Out.WriteLine();

DzienTygodnia dzien2 = DzienTygodnia.Poniedzialek
System.Console.Out.WriteLine("Dzien2: " + dzien2);
System.Console.Out.WriteLine();

Uruchamiając tak skonstruowany kod otrzymamy następujące wyniki:

Dzien: 0

Dzien2: Poniedzialek

Problem nie wydaje się być skomplikowany, ale potrafi napsuć krwi. Otóż, co się stało. Kompilator inicjalizuje zmienną dzien domyślną wartością 0, która nie jest wymieniona w definicji DzienTygodnia.

Należy też pamiętać, że problem ten występuje w sytuacji gdy używamy DzienTygodnia jako element składowy struktury i klasy:

public struct StructDzienTygodnia
{
  DzienTygodnia dzien;
  ...
  public StructDzienTygodnia(DzienTygodnia _dzien)
  {
    dzien = _dzien;
  }
  public DzienTygodnia Dzien
  {
    get { return dzien; }
  }
}

public class ClassDzienTygodnia
{
  DzienTygodnia dzien;
  ...
  public ClassDzienTygodnia(DzienTygodnia _dzien)
  {
    dzien = _dzien;
  }
  public DzienTygodnia Dzien
  {
    get { return dzien; }
  }
}

W przypadku klasy sytuacja jest zdecydowanie lepsza niż w przypadku struktury. Pomimo faktu, że struktura ma zdefiniowany konstruktor, który zastępuje konstruktor domyślny kompilator pozwala nam na definicję struktury za pomocą konstruktora domyślnego, czyli:

StructDzienTygodnia dzien3 = new StructDzienTygodnia();

Oczywiście jeżeli w tej sytuacji sprawdzi się wartość to będzie ona błędna – 0.

Trochę lepiej ma się sytuacja, gdy użyjemy enum w klasie. Wtedy jeżeli zdefiniujemy własny konstruktor, to nie będziemy mogli użyć domyślnego konstruktora. Kompilator zgłosi błąd. W tej sytuacji problem błędu jest przekazywany poza klasę ponieważ zawsze można przecież stworzyć obiekt w następujący sposób:

ClassDzienTygodnia dzien6 = new ClassDzienTygodnia(new DzienTygodnia());

No ale to jest już raczej świadome działanie programisty.

Ale konkludując. Tworząc dowolny enum zawsze pamiętaj, aby jedną z jego wartości było 0. Dlatego też pierwotna definicja powinna wyglądać następująco:

public enum DzienTygodnia
{
  Blad = 0,
  Poniedzialek = 1,
  Wtorek = 2,
  Sroda = 3,
  Czwartek = 4,
  Piatek = 5,
  Sobota = 6,
  Niedziela = 7
}