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