Pregunta

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

enum MyEnum : Int32
{
    Value = 1
}

... no compilar? Donde como

enum MyEnum : int
{
    Value = 1
}

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

¿Fue útil?

Solución

El tipo subyacente es de hecho el mismo, pero el compilador depende del tipo para ser el alias exacto. Este es un error de compilación basado en el análisis. Eché un vistazo a la especificación gramatical de 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 gramatical integral-types .

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

No sé la razón para forzar este límite al paso de análisis, pero puedo intentar adivinar: dado que Int32 no es una palabra clave, podría referirse a algo más que la estructura real. Si el analizador tiene que conocer el tipo para construir AST diferente para cada tipo base, entonces no puede depende del token que no es una palabra clave.

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

Otros consejos

Una curiosidad familiar ... la especificación del lenguaje establece (14.1):

  

Una declaración 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 utilizar como un tipo subyacente. Una declaración 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 irrazonable pensar que cualquiera podría funcionar ... pero de hecho no lo hace. Generalmente no es un gran problema, pero no deja de ser intrigante.

Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top