2010-09-23 13 views
6

Powiel możliwe:
C# int, Int32 and enum'sczłonkowie enum typu Int32

To może być raczej podstawowy/prostsze pytanie tworzę enum w następujący sposób.

Przypadek 1 doskonale się kompiluje. Ale Przypadek 2 zgłasza błąd. Dla mojego zrozumienia int i Int32 oznacza to samo w języku C#.

Case 1

[Flags] 
    public enum MyEnum : int 
    { 
     Red = 0x1, 
     Green = 0x2, 
     Blue = 0x4 
    } 

Case 2

[Flags] 
    public enum MyEnum : Int32 
    { 
     Red = 0x1, 
     Green = 0x2, 
     Blue = 0x4 
    } 

Jaka jest różnica tutaj i dlaczego C# nie skompilować kod, kiedy członkowie wyliczenia są podane, aby być typu Int32?

+1

Duplikat. http://stackoverflow.com/questions/1813408/c-int-int32-and-enums –

+0

Ciekawe ... Myślałem int i Int32 były idealnie równoważne kompilator, ale najwyraźniej tak nie jest. –

+1

Nie są nawet bliskie odpowiednikowi. 'int' jest słowem kluczowym,' Int32' jest zwykłym identyfikatorem, który jest niekwalifikowaną nazwą typu pierwotnego zdefiniowanego w przestrzeni nazw 'System'. Tak, na przykład, mógłbym utworzyć klasę 'MyNamespace.Int32', ale' MyNamespace.int' jest błędem składni. –

Odpowiedz

14

Od a Microsoft bug report here:

Objaw
Jeśli używasz System.Int16/Int32/Int64 zamiast krótkich/INT/Długie oświadczyć Enum, będzie się błąd kompilacji.

Przyczyna główna
Jest to zgodne z projektem. Używanie aliasu typu wartości jest wymagane dokładnie w deklaracji Enum.

Jest "projektowany".

  1. Składnia jest poprawna. Specyfikacja C# wyraźnie stwierdza, że ​​podstawowym typem enum musi być bajt, sbyte, short, ushort, int, uint, long lub ulong.

  2. Mimo że podstawowy rodzaj "Short" i "System.Int16" są jednym i tym samym, nie są tak identyczne, jak zakładamy. System.Int16 jest typem, a skrót jest słowem kluczowym typu.

  3. ValueType jest zapieczętowany. Nie można dziedziczyć po żadnej klasie wywodzącej się z klasy System.ValueType.

  4. Pozwala jednak na użycie słowa kluczowego do kontroli. Celem jest zapobieganie używaniu nazw wszelkich typów wywodzących się z System.ValueType podczas deklarowania innych typów. Pierwotnym zamierzeniem jest zapewnienie ściśle kontrolowanego mechanizmu, który pozwala zadeklarować typy dziedziczące po System.ValueType. Jednak MSDN mówi "Słowa kluczowe w stylu C# i ich aliasy są wymienne", co często pozwala klientom czuć się zagubionymi/niewytłumaczalnymi. Uważają, że jest to błąd kompilatora lub gramatyki.

działalności Wpływ Doświadczenie/klienta
Od „krótkie” i „System.Int16” są takie same jeden typ bazowy i mogą być wymienne, wiele klienci czują się zagubieni/niewytłumaczalne, dlaczego nie mogą być stosowane zamiennie w deklaracji Enum. Uważają, że jest to błąd kompilatora lub gramatyki. Głos klientów: To brzmi jak mały błąd kompilatora (mały, ponieważ łatwo go obejść). Oto, co MSDN mówi: "Słowa kluczowe w stylu C# i ich aliasy są wymienne." Moim zdaniem jest to prawdziwy, ale malutki, kompilator (lub może gramatyka) błąd Fakt, że kompilator pozwala ci używać tu" short ", a nie" System.Int16 "jest dziwactwem kompilatora (może nie bug, ale dziwactwo)

+5

tylko ... "Krótki" nie jest słowem kluczowym (w języku C#). C# jest językiem rozróżniającym wielkość liter. Dlaczego ludzie są tak zaniedbani podczas pisania raportów o błędach? –

+0

haha ​​tak, nawet tego nie zauważyłem. –

Powiązane problemy