2012-08-08 14 views
5

Mam enum jak to w starym kawałku kodu:kompilacji Konwersja uint do int w C#

[Flags] 
public enum Example: uint 
{  
    Foo = 0x00000001, 
    Bar = 0xC0000000 
} 

Teraz FxCop is complaining o tym wyliczenia stosując uint zamiast int jak to cofając pole. (I zostałem zlecony, aby ten kod był jak najbardziej czysty FxCop ...) Ale istnieje istniejąca wartość wyliczeniowa, która wykorzystuje bit wyższego rzędu enum, i nie mogę tego zmienić, ponieważ został utrwalony format na dysku. Kiedy próbuję skompilować tego, # kompilator C słusznie narzeka:

error CS0266: Cannot implicitly convert type 'uint' to 'int'. An explicit conversion exists (are you missing a cast?) 

Tak, miałem zamiar zmienić go na to zamiast:

[Flags] 
public enum Example 
{  
    Foo = 0x00000001, 
    Bar = (int)0xC0000000 
} 

Jednak nie jestem przekonany, że mogę polegać na tym nie rzuca arytmetycznych wyjątków lub nie jest obsługiwany poprawnie podczas odczytu lub zapisu na dysku. Czy mogę polegać na formacie bitowym dopasowanym do formatu używanego, gdy enum jest wspierane przez unsigned int?

+0

To może nie rozwiązać wszystkich problemów z FxCop. Nie zdziwiłbym się, gdyby powiedział ci, że powinieneś mieć członka "None" dla wszystkich "[Flags"] wyrażeń. Wydaje się to być bardzo dobrym miejscem do wstawiania ukrytych ostrzeżeń z komentarzem, dlaczego nie możesz zmienić kodu. –

+0

@Cody: Tak, może to skończyć. –

Odpowiedz

8

Użyj tutaj niezaznaczonego słowa kluczowego, a wszystko będzie dobrze; utrzymany wzór bitowy będzie taki, jakiego oczekujesz.

[Flags] 
public enum Example 
{ 
    Foo = 0x00000001, 
    Bar = unchecked((int)0xC0000000); 
} 
0

odpowiedź Thomasa jest w 100% rację, ale dodam moje trzy grosze do niej: zamiast „fixing” kodu, który był już poprawny, zawsze można wyciszyć reguły FxCop dla jakiejś części kodu.

Zob. How do I suppress FxCop rule 'DoNotCatchGeneralExceptionTypes' with SupressMessage? i jest to zaakceptowana odpowiedź na przykład użycia. Wszystko jest ustawione w kodzie i .csproj, więc wszystkie takie ustawienia supresji pozostają z kodem, gdy są rozdawane klientowi końcowemu.

+0

FxCop jest tam, aby znaleźć "prawidłowe" rzeczy, które są złymi pomysłami. Jeśli stłumię wszystko, to pokonuje to punkt. (Aby było jasne, "jak FxCop czysty jak to możliwe", co robię przechodzi przez nasze tłumienia i usuwanie ich) –

+1

Mój poprzedni komentarz był nonsensem. Próbowałem powiedzieć, że .Net jest pełen tłumień FxCop, sprawdź sam. Niemal dla każdej reguły istnieje przypadek, w którym reguła jest "ogólnie słuszna", ale w rzeczywistości niepotrzebna. Myślę, że jest tak w przypadku twojej kompatybilności z bazowym magazynem. Oczywiście, chyba że twoje wyliczenia i zgromadzenia są używane w językach, które nie mają "niepodpisanych". W każdym razie, jeśli musisz to zrobić - zrób to :) Odpowiedź Thomasa jest świetna. Właśnie dodałem moje do kompletności. – quetzalcoatl