「デフォルト」メンバーがない場合、リテラル int 0 を表す値を持つことは価値があると思います。
何があっても、指定された列挙型はリテラル値 0 で作成されます。ここでの最も単純なケースは、構造体のメンバーとしてです。AC# 構造体には常に、すべてのフィールドをデフォルト値に初期化する空のデフォルト コンストラクターがあります。列挙型の場合、それはリテラル値 0 になります。問題は、それをどのように処理するかです。
私にとって、これはスタイルの問題です。列挙型が値に明示的に初期化されていない場合、任意の有効な値または明示的な初期化の欠如を示す特定の値を指定する必要がありますか?
enum Color { Unknown, Red, Blue }
enum Color2 { Red,Blue }
struct Example<T> {
Color color;
}
static void SomeMethod() {
var v1 = new Example<Color>();
var v2 = new Example<Color2>();
}
v1 の場合、カラー フィールドが検査されると、初期化されていないフィールドとして明示的にラベル付けされます。v2 では、フィールドは単純に「赤」になります。プログラマーが明示的に「赤」に設定されているか、暗黙のデフォルト値が「赤」に設定されているかを検出する方法はありません。
これが問題を引き起こす別のケースは、列挙値に対して switch ステートメントを実行することです。Color2 の定義を少し変更してみましょう。
enum Color2 { Red = 1, Blue = 2 }
static void SomeOtherMethod(p1 as Example<Color2>) {
switch ( p1.color ) {
case Color.Red: {}
case Color.Blue: {}
default: {throw new Exception("What happened?"); }
}
}
スイッチは、列挙型のすべての明示的な値を処理します。ただし、このコードは Example<Color2> の既定のコンストラクターでは失敗し、このコンストラクターを抑制する方法はありません。
これにより、もう少し重要なルールが生まれます: リテラル値 0 に対して明示的な列挙値を使用します。