2009-11-28 24 views
31

Si int es sinónimo de Int32 ¿por quéC# INT, Int32 y enumeraciones

enum MyEnum : Int32 
{ 
    Value = 1 
} 

... no compilar? Donde como

enum MyEnum : int 
{ 
    Value = 1 
} 

, aunque al pasar el cursor sobre la palabra int, se mostrará struct System.Int32?

+0

¿Cuál es el error en el tiempo de compilación? – Donnie

+2

@Donnie: escriba byte, sbyte, corto, ushort, int, uint, largo o ulong esperado. Aparentemente, una restricción en .Net obliga al usuario a utilizar solo palabras clave en lugar de nombres de clase en una enumeración. – Webleeuw

+0

Interesante. ¡Aprendí algo, yay! – Donnie

Respuesta

29

El tipo subyacente es de hecho el mismo, pero el compilador depende del tipo que sea como el alias exacto. Este es un error de compilación basado en el análisis sintáctico. Eché un vistazo a la especificación de gramática C# y los tipos subyacentes definidos allí como tokens basados ​​en el alias (por ejemplo, 'int', 'unit' ... etc.). El analizador espera cadenas específicas de de tipo integral regla de gramática.

el error es un error de análisis aunque ambos enum Enum : int significa lo mismo que enum Enum : Int32.

no sé la razón de este límite obligando a analizar paso, pero puede intentar adivinar: Desde Int32 no es una palabra clave que podría referirse a algo distinto del int estructura real. Si el analizador debe conocer el tipo para construir diferentes AST para cada tipo de base, entonces no puede depender de un token que no sea una palabra clave.

pesar de que el C# especificación define la int palabra clave con el alias explícita System.Int32, sigue siendo un problema para conseguir esta información sobre el tipo explícita (Int32) durante el análisis paso, ya que requiere una gran cantidad de información de contexto que no se puede inferir en este paso.

+1

Consulte también este error de MS Connect donde explican la justificación para no cambiar el código de conducta : http://connect.microsoft.com/VisualStudio/feedback/details/557064/c-enum-declaration-only-accept-value-type-alias-eg-short-int-long-instead-of-net-valuetype-eg-system-int16-system- int32-system-int64 –

+0

@MichaelEdenfield que no se puede acceder a los enlaces de Microsoft Connect. ¿Puedes realizar el pago, debería ser visible públicamente? Recibo este error 'No se puede encontrar el contenido que solicitaste o no tienes permiso para verlo. Si cree que ha llegado a esta página por error, haga clic en el enlace Ayuda en la parte superior de la página para informar el problema e incluya esta identificación en su correo electrónico: e4c85df6-9343-4045-88d2-fc2d64bd01de ' –

+1

No, desafortunadamente caducan conectan enlaces después de ciertos puntos. La esencia del error era que "int" es una palabra clave e "Int32" es un tipo, y el analizador actualmente espera una "palabra clave" válida como el tipo base enum. Cambiar el comportamiento requiere cambiar el orden de los pasos de sustitución de palabra clave a tipo de enumeración enum y es un gran cambio para un pequeño beneficio pequeño, por lo que probablemente no ocurra (a menos que haya otros cambios relacionados) en la misma área.) –

14

una curiosidad familiar ... los estados de especificaciones idioma (14.1):

Una declaración de enumeración podrá declarar explícitamente un tipo subyacente del byte, sbyte, corta, ushort, int, uint largo o ulong. Tenga en cuenta que char no se puede usar como un tipo subyacente. Una declaración enum que no declara explícitamente un tipo subyacente tiene un tipo subyacente de int.

Pero como es intgeneral simplemente un alias para System.Int32 no es irrazonable pensar bien podría funcionar ... pero de hecho no lo hace. En general, no es un gran problema, pero intrigante, no obstante.