質問
int
が Int32
と同義である場合
enum MyEnum : Int32
{
Value = 1
}
...コンパイルしませんか?どこに
enum MyEnum : int
{
Value = 1
}
intワードの上にカーソルを置くと、System.Int32構造体が表示されますか?
解決
基礎となる型は実際には同じですが、コンパイラーは型に正確なエイリアスとして依存しています。これは、解析に基づくコンパイルエラーです。 C#の文法仕様と、エイリアスに基づいてトークンとして定義されている基になる型(たとえば、「int」、「unit」...など)を調べました。パーサーは、 integral-types 文法規則から特定の文字列を予期します。
エラーは解析エラーです enum Enum:int
は enum Enum:Int32
と同じ意味です。
この制限を解析ステップに強制する理由はわかりませんが、推測してみることができます。Int32はキーワードではないため、実際のint構造体を参照している可能性があります。パーサーが各ベースタイプに対して異なる AST を構築するためにタイプを認識しなければならない場合、キーワードではないトークンに依存します。
C#仕様では int キーワードを明示的なエイリアス System.Int32 として定義していますが、解析中に明示的な型(Int32)に関するこの情報を取得することは依然として問題ですこのステップでは推測できない多くのコンテキスト情報が必要なので、ステップ。
他のヒント
おなじみの好奇心...言語仕様には次のように記載されています(14.1):
enum宣言は、バイト、sbyte、short、ushort、int、uint、long、またはulongの基本型を明示的に宣言できます。 charは基になる型として使用できないことに注意してください。基になる型を明示的に宣言しない列挙型宣言の基になる型はintです。
しかし、 int
は 一般的に であるため、 System.Int32
のエイリアスであるため、ではありませんどちらかが機能するかもしれないと考えるのは不合理です ...しかし、実際には機能しません。一般的には大きな問題ではありませんが、それでもなお興味をそそられます。