Typ typu wyliczeniowego

Typ typu wyliczeniowego
RU
  • Rejestracja: dni
  • Ostatnio: dni
  • Postów: 211
0

Mam taki typ wyliczeniowy:

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

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

Kopiuj
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:

Kopiuj
 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?

Patryk27
  • Rejestracja: dni
  • Ostatnio: dni
  • Lokalizacja: Wrocław
  • Postów: 13042
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ą.

neves
  • Rejestracja: dni
  • Ostatnio: dni
  • Lokalizacja: Kraków
  • Postów: 1114
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.

Aventus
  • Rejestracja: dni
  • Ostatnio: dni
  • Lokalizacja: UK
  • Postów: 2235
2

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

Sarrus
  • Rejestracja: dni
  • Ostatnio: dni
  • Postów: 2512
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.

AK
  • Rejestracja: dni
  • Ostatnio: dni
  • Postów: 3561
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

Zarejestruj się i dołącz do największej społeczności programistów w Polsce.

Otrzymaj wsparcie, dziel się wiedzą i rozwijaj swoje umiejętności z najlepszymi.