2009-11-28 26 views
31

intInt32と同義であるならば、なぜ...C#のint型、列挙型のInt32と

enum MyEnum : Int32 
{ 
    Value = 1 
} 

コンパイルされませんか?どこ

enum MyEnum : int 
{ 
    Value = 1 
} 

としてもint型の単語の上にカーソルを置くものの、構造体可能System.Int32が表示されますでしょうか?

+0

コンパイル時のエラーは何ですか? – Donnie

+2

@Donnie:byte型、sbyte型、short型、ushort型、int型、uint型、long型、またはulong型が予想されます。 明らかに、.Netの制限により、ユーザーは強制的に列挙型のクラス名ではなくキーワードのみを使用するようになります。 – Webleeuw

+0

興味深い。何かを学んだ、よろしく! – Donnie

答えて

29

基本的な型はまったく同じですが、コンパイラは型によって正確な別名になります。これは解析に基づくコンパイルエラーです。私は、C#文法仕様とそのエイリアスに基づいたトークン(例えば、 'int'、 'unit' ...など)で定義されている基礎となる型を調べました。パーサーは、整数型文法規則の特定の文字列を想定しています。

エラーは両方enum Enum : intenum Enum : Int32と同じ意味にもかかわらず、解析エラーあります。

この制限を解析ステップに強制する理由はわかりませんが、推測してみることができます。Int32はキーワードではないため、実際のint構造体を参照する可能性があります。パーザがタイプを知って、各基本タイプに異なるASTを構築する必要がある場合、キーワードではないトークンに依存することはできません。 C#の仕様は明示的な別名としてint型キーワードを定義していても

可能System.Int32、それはコンテキスト情報の多くを必要とするための解析ステップの間に明示的な型(Int32)をに関するこの情報を取得するにはまだ問題ですこのステップで推論することはできません。

+1

を参照してください。このMS Connectのバグも参照してください。ここでは、バーチャルを変更しないという正当性について説明しています:http://connect.microsoft。com/VisualStudio/feedback/details/557064/c-enum-declaration-only-accepts-value-type-alias-eg-short-int-long-of-net-valueetype-eg-system-int16-system- int32-system-int64 –

+0

@MichaelEdenfield Microsoft Connectリンクにアクセスできません。あなたはそれを一般に公開する必要がありますか?このエラーが表示されます。要求したコンテンツが見つからないか、コンテンツを表示する権限がありません。 このページに間違いがあると思われる場合は、ページ上部の[ヘルプ]リンクをクリックして問題を報告し、電子メールにこのIDを含めてください:e4c85df6-9343-4045-88d2-fc2d64bd01de ' –

+1

いいえ、残念ながら、彼らは特定のポイントの後に接続リンクの有効期限を切る。バグの要点は、「int」はキーワードであり、「Int32」は型であり、パーザは現在、有効な「キーワード」を列挙型として期待しています。この振る舞いを変更するには、キーワードから型への置換と列挙型の構文解析のステップの順序を変更する必要があります。これは小さな小さな利点にとって大きな変更です。したがって、他の関連する変更同じ地域にあります) –

14

おなじみの好奇心...言語仕様の状態(14.1):

列挙型の宣言が明示的に長いまたはULONG、バイト、sbyte、短い、USHORT、INT、UINTの基になる型を宣言してもよいです。 charは基になる型として使用できないことに注意してください。基になる型を明示的に宣言しないenum宣言には、基になるint型があります。

しかしint以来

ある一般ただ、それはどちらかが仕事かもしれないと思うし 無理ではありません...しかし、確かにそれはない System.Int32の別名。一般的には大きな問題ではありませんが、興味をそそるものではありません。