Domanda

Se int è sinonimo di Int32 perché

enum MyEnum : Int32
{
    Value = 1
}

... non compilare? Dove come

enum MyEnum : int
{
    Value = 1
}

, anche se spostando il cursore sulla parola int verrà visualizzato struct System.Int32?

È stato utile?

Soluzione

Il tipo sottostante è effettivamente lo stesso, ma il compilatore dipende dal tipo come alias esatto. Questo è un errore di compilazione basato sull'analisi. Ho dato un'occhiata alla specifica grammaticale C # e ai tipi sottostanti definiti lì come token basati sull'alias (ad esempio 'int', 'unit' ... ecc.). Il parser si aspetta stringhe specifiche dalla regola grammaticale tipi integrali .

L'errore è un errore di analisi anche se entrambi enum Enum: int equivalgono a enum Enum: Int32 .

Non conosco il motivo per forzare questo limite all'analisi del passaggio, ma posso provare a indovinare: poiché Int32 non è una parola chiave, potrebbe riferirsi a qualcos'altro dell'attuale struttura. Se il parser deve conoscere il tipo per creare AST diversi per ciascun tipo di base, allora non può dipende dal token che non è una parola chiave.

Anche se la specifica C # definisce la parola chiave int come alias esplicito System.Int32 , è ancora un problema ottenere queste informazioni sul tipo esplicito (Int32) durante l'analisi poiché richiede molte informazioni di contesto che non possono essere dedotte in questo passaggio.

Altri suggerimenti

Una curiosità familiare ... afferma la specifica della lingua (14.1):

  

Una dichiarazione enum può dichiarare esplicitamente un tipo sottostante di byte, sbyte, short, ushort, int, uint, long o ulong. Si noti che non è possibile utilizzare char come tipo sottostante. Una dichiarazione enum che non dichiara esplicitamente un tipo sottostante ha un tipo sottostante di int.

Ma poiché int è in generale è solo un alias per System.Int32 non è irragionevole pensare che entrambi potrebbero funzionare ... ma in effetti no. Generalmente non è un grosso problema, ma intrigante comunque.

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top