C # int, Int32 e enums
Pergunta
Se int
é sinônimo de Int32
por que
enum MyEnum : Int32
{
Value = 1
}
... não compilar? Onde como
enum MyEnum : int
{
Value = 1
}
vontade, apesar de passar o cursor sobre a palavra int irá exibir struct System.Int32?
Solução
O tipo subjacente é realmente o mesmo, mas o compilador depende do tipo a ser como o alias exato. Este é um erro de compilação com base em análise. Dei uma olhada C especificação # gramática e os tipos subjacentes definidos lá como fichas com base no alias (por exemplo, 'int', 'unidade' ... etc.). O analisador espera cordas específicas do integrais tipos regra gramatical.
O erro é um erro de análise embora ambos enum Enum : int
significa o mesmo que enum Enum : Int32
.
Eu não sei a razão para forçar esse limite para analisar passo, mas eu posso tentar adivinhar: Desde Int32 não é uma palavra-chave que pode referir-se a algo diferente do struct int real. Se o analisador tem que saber o tipo, a fim de diferente construção AST para cada tipo de base, então ele não pode dependem de token que não é uma palavra-chave.
Mesmo que a especificação C # define o int palavra-chave como apelido explícita System.Int32 , ainda é um problema para obter esta informação sobre o tipo explícito (Int32) durante a análise etapa, uma vez que requer uma grande quantidade de informações de contexto que não pode ser deduzida nesta etapa.
Outras dicas
Uma curiosidade familiar ... estados da linguagem de especificação (14.1):
Uma declaração enum pode declarar explicitamente um tipo subjacente de byte, sbyte, short, ushort, int, uint, longo ou ulong. Note-se que de char não pode ser usado como um tipo subjacente. Uma declaração enum que não declarar explicitamente um tipo subjacente tem um tipo subjacente de int.
Mas desde int
é geralmente apenas um alias para System.Int32
não é razoável para pensar tanto trabalho poder ... mas na verdade, não. Geralmente, não é um grande problema, mas nenhum intrigante a menos.