C # int, Int32 y enumeraciones

Si int es sinónimo de Int32 ¿por qué?

 enum MyEnum : Int32 { Value = 1 } 

… no comstackr? Donde como

 enum MyEnum : int { Value = 1 } 

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

El tipo subyacente es de hecho el mismo, pero el comstackdor depende del tipo que sea como el alias exacto. Este es un error de comstackció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 la regla de gramática de tipos integrales .

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

No sé el motivo para forzar este límite al paso de análisis sintáctico, pero puedo intentar adivinar: dado que Int32 no es una palabra clave, podría referirse a algo diferente de la estructura int 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.

Aunque la especificación C # define la palabra clave int como el alias explícito System.Int32 , sigue siendo un problema obtener esta información sobre el tipo explícito (Int32) durante el paso de análisis, ya que requiere mucha información de contexto que no se puede inferir en este paso.

Una curiosidad familiar … el lenguaje especifica estados (14.1):

Una statement enum puede declarar explícitamente un tipo subyacente de byte, sbyte, short, ushort, int, uint, long o ulong. Tenga en cuenta que char no se puede usar como un tipo subyacente. Una statement enum que no declara explícitamente un tipo subyacente tiene un tipo subyacente de int.

Pero como int es generalmente solo un alias para System.Int32 no es irracional pensar que cualquiera de los dos podría funcionar … pero de hecho no es así. En general, no es un gran problema, pero intrigante, no obstante.