2010-04-12 8 views
7

Muszę użyć tego wyliczenia w mojej aplikacji C#, ale nie pozwoli mi użyć tych wartości. Kiedy określam typ jako uint, mogę użyć wartości -1, a gdy podam int, nie mogę użyć ostatnich 2 wartości. Czy istnieje sposób, aby użyć niezaznaczonego słowa kluczowego tutaj, aby umożliwić mi zdefiniowanie wszystkich tych wartości? Te wartości pochodzą z zewnętrznego źródła, więc nie mogę ich zmienić.Jak używać niebezpiecznych wartości w wyliczaniu?

internal enum MyValues : int 
{ 
    value1 = -1, 
    value2 = 0, 
    value3 = 0x80000000, 
    value4 = 0xFFFFFFFF 
} 

Odpowiedz

9

Jeśli chcesz, aby -1 miała inną wartość od 0xFFFFFFFF, będziesz potrzebować typu większego niż 32-bitowe. Wypróbuj long.

+0

Korzystanie typ danych 64bit nie jest opcją, używam interop, aby zwrócić wartość 32-bitową. –

+0

Jeśli -1 i 0xFFFFFFFF są technicznie to samo przy użyciu Uint, to chyba mogę po prostu usunąć wartość -1? –

+1

@Jon: -1 nie istnieje, gdy używasz uint - musisz dokonać niezaznaczonej konwersji. –

1

Może spróbować ulong wylicza zamiast int?

2

Ponieważ te wartości wyglądają na stałe, po prostu utwórz klasę statyczną, aby zatrzymać wartości. Ponadto, można używać niezależnie od rodzaju chcesz:

public static class MyValues 
{ 
    public const int value1 = -1; 
    public const int value2= 0; 
    public const int value3 = 0x80000000; 
    public const int value4 = 0xFFFFFFFF; 
} 
2

Jednym ze sposobów rozwiązania tego problemu jest użycie wartości normalnych dla enum (0, 1, 2, 3), a także tworzyć klasę lub parę metod, aby przekonwertuj przychodzące wartości na członków enum i na odwrót.

+0

Napisałeś ten duży długi wpis, a potem zauważyłeś, że powiedziałeś to samo. +1. @Jon Tackabury: odpowiedź @Jon Seigel jest najbardziej do utrzymania opcja. Nie zakładaj, że -1 jest takie samo jak 0xFFFFFFFF, chyba że masz bardzo intymną wiedzę na temat biblioteki, której używasz. – Randolpho

3

0xFFFFFFFF to liczba 32-bitowa, więc powinien być zdolny do wyliczenia: int (czuję długo typ jest przesada :))

Czy próbowałeś

enum YourEnum : int { /*...*/, value4 = unchecked((int)0xFFFFFFFF) }; 
Powiązane problemy