2010-09-23 14 views
6

Eventuali duplicati:
C# int, Int32 and enum'smembri enum di tipo Int32

Potrebbe essere un piuttosto di base/domanda più semplice sto creando un enum nel modo seguente.

Il caso 1 è perfetto. Ma il caso 2 genera un errore. Secondo me int e Int32 significano lo stesso in C#.

Caso 1

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

Caso 2

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

Qual è la differenza qui e perché C# non compilare il codice quando i membri della enum sono specificati per essere di tipo Int32?

+1

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

+0

Interessante ... ho pensato int e Int32 erano perfettamente equivalente al compiler, ma apparentemente non è il caso –

+1

Non sono nemmeno vicini all'equivalente. 'int' è una parola chiave,' Int32' è un identificatore ordinario che sembra essere il nome non qualificato di un tipo primitivo definito nello spazio dei nomi 'Sistema'. Quindi, ad esempio, potrei creare una classe 'MyNamespace.Int32', ma' MyNamespace.int' è un errore di sintassi –

risposta

14

Da a Microsoft bug report here:

Sintomo
Se si utilizza System.Int16/Int32/Int64 anziché a breve/Int/lungo a dichiarare Enum, otterrà errore di compilazione.

Root Cause
È di progettazione. L'utilizzo dell'alias del tipo di valore è richiesto esattamente nella dichiarazione Enum.

È "di progettazione".

  1. La sintassi è corretta. Le specifiche C# affermano esplicitamente che il tipo sottostante all'enum deve essere byte, sbyte, short, ushort, int, uint, long o ulong.

  2. Anche se il tipo sottostante di "Short" e "System.Int16" sono uno e lo stesso, non sono identici a quelli che si presume. System.Int16 è un tipo e Short è una parola chiave type.

  3. ValueType è sigillato. Non è possibile ereditare da qualsiasi classe derivante da System.ValueType.

  4. Tuttavia, consente di utilizzare la parola chiave da controllare. L'intento è di impedire l'uso di nomi di qualsiasi tipo che derivano da System.ValueType quando si dichiarano altri tipi. L'intento originale è quello di fornire un meccanismo strettamente controllato che consenta di dichiarare i tipi che ereditano da System.ValueType. Tuttavia, MSDN dice "Le parole chiave di tipo C# ei loro alias sono intercambiabili", che spesso lasciano i clienti confusi/inspiegabili. Pensano che sia un compilatore o un bug di grammatica.

Business Impact Experience/clienti
Dal momento che il “corto” e "System.Int16" sono lo stesso tipo sottostante e possono essere intercambiabili, molti clienti si sentono confusi/inspiegabile il motivo per cui non può essere intercambiabile nella dichiarazione Enum. Pensano che sia un compilatore o un bug di grammatica. The Voice of customers: Questo sembra un piccolo bug del compilatore (piccolo perché è facile da risolvere). Ecco cosa dice MSDN "Le parole chiave di tipo C# ei loro alias sono intercambiabili." Dal mio punto di vista questo è un bug reale, ma piccolo, del compilatore (o forse grammatica) Il fatto che il compilatore ti permetta di usare" short "qui e non" System.Int16 "è una stranezza del compilatore (forse non un bug, ma un capriccio)

+5

solo ... "Breve" non è una parola chiave (in C#). C# è un linguaggio sensibile al maiuscolo/minuscolo. Perché le persone sono così sciatte quando scrivono segnalazioni di bug? –

+0

haha ​​si, non me ne sono nemmeno accorto. –

Problemi correlati