Typ typu wyliczeniowego

0

Mam taki typ wyliczeniowy:

enum Kolory : int { czerwony = 20, niebieski = 10 }

i chciałem się dobrać do niego bez rzutowania:

int zmienna1 = Kolory.czerwony;

Ale kompilator zwraca mi uwagę, że nie może zrobić konwersji na typ int. Myślałem, że zadeklarowanie typu wyliczeniowego rozwiąże ten problem ale nie działa to w ten sposób i muszę robić tak:

 int zmienna1 = (int)Kolory.czerwony;

Czemu tak się dzieje?
Zawsze wykorzystuję rzutowanie ale chciał bym wiedzieć czemu muszę tak robić.

Co się stało z działem "Newbie", że trafił do archiwum?

5

Musisz wykonywać rzutowanie, ponieważ... dokumentacja mówi, że musisz wykonywać rzutowanie :-)

Może zdawać się to zbędne, lecz taką decyzję podjęli twórcy - prawdopodobnie chodzi o to, że Kolory oraz int są w rzeczywistości dwoma różnymi typami (nawet jeśli pod spodem są reprezentowane w identyczny sposób), więc konieczność rzutowania ogranicza potencjalne błędy wynikające z mieszania dwóch różnych enumów ze sobą.

3

Składnia jest trochę myląca, bo typem bazowym enuma zawsze jest System.Enum, a jawną deklaracją zmieniamy jedynie reprezentację w pamięci, czyli z punktu widzenia obiektowego są to ciągle różne typy. Dałoby się to zrobić bez rzutowania gdyby istniał implicit operator konwersji, a najwyraźniej takowy nie istnieje.

2

Zawsze możesz napisać jakąś extension metod i wywoływać to np. tak: Colour.Red.ToInt().

2

Generalnie czasem nawet jak rzutowanie jest dostępne to musi być ono jawnie podane. Jest to zrobione po to, żebyś przypadkiem przez niejawne konwersje nie zrobił sobie z kodu kaszanki.

0

Enum 'odseparowany' jako typ ma głęboki sens (zgadzam się z Patrykiem)
Natomiast jeśli rzeczywiście chcesz sens integera, użyj kilku const int

1 użytkowników online, w tym zalogowanych: 0, gości: 1