キーワードを用いて定義します。それ以降のメンバーは自動的にインクリメントされるので、Direction.Upは1、Downは2、Leftは3、Rightは4となります。初期値は省くこともできます。Right}この場合、Upは0となり、Downは1となります。内で値を区別するのに役立ちます。利用法はとてもシンプルです。名前を使って型を宣言するだけです。計算値と定数を混在させることができます。後ろでなければなりません。したがって次のようには宣言できません。似たようなコンセプトですが、後述するように実行時のふるまいに少しだけ違いがあります。メンバーを初期値として持たなければなりません。オートインクリメントしませんが、そのかわりうまく"serialize"することができます。あれば、実行中の値からもメンバーの名前以上の意味を汲み取れます。混在させることは可能です。実行中のふるまいをうまく利用しようとしているのでない場合は、おすすめしません。メンバーはそれぞれ定数か計算値を持ちます。メンバーは定数を持っているとみなされます。X}初期値を持たず、かつ一つ前のメンバーが数値定数である場合。足した数値定数となります。式とは、コンパイル時に評価可能な式のことで、次のような場合に当てはまります。式の結果がNaNかInfinityの場合はコンパイルエラーとなります。メンバーはすべて計算値としてみなされます。メンバーは、初期値を持たないか、あるいは、次のような初期値を持ちます。メンバーであるとき、いくつかの特殊な構文が使用できます。メンバーは型としても使用することができるようになります。メンバーの値だけを持つことができるというように定義することができます。自身に存在する値の集まりであること利用するということを知っておいてください。値を比較するときに起こしがちなささいなバグを防ぐことが可能になります。次の例を見てください。}}この例では、xがE.Fooではないかどうかをチェックしています。このチェックがパスすれば、||はスキップされて、if文中が実行されます。前述のチェックがパスしなかった場合、xはE.Fooに限定されます。そのため、xがE.Barであるかどうかを確認することは無駄ということになります。実行時にも存在する実オブジェクトです。Z}実際に次の関数に渡すことができます。