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
}


jeśli chodzi o '0′ to warto przeczytać:
http://blogs.msdn.com/b/kcwalina/archive/2004/05/18/134208.aspx
Ja bym niedzielę ustawił na 0 🙂
u mnie DzienTygodnia dzien = DzienTygodnia.Poniedzialek; daje wynik Poniedzialek
I tak powinno być. Zrobiłem mały błąd przyklejając kod.
Teraz już jest ok.
’ dzien2′ da 0 a 'dzien’ da poniedzialek
Pozdrawiam