9

この例のために、レコード内の任意の 2 バイトが曜日を表すことを指定するファイルを解析しようとしているとします。

DayOfWeek:

 - 0    = Monday
 - 1    = Tuesday
 - 2    = Wednesday
 - 3    = Thursday
 - 4    = Friday
 - 5    = Saturday
 - 6    = Sunday
 - 7-15 = Reserved for Future Use

したがって、このフィールドにマップする列挙を定義できます。

public enum DaysOfWeek
{
     Monday = 0,
     Tuesday = 1,
     Wednesday = 2,
     Thursday = 3,
     Friday = 4,
     Saturday = 5,
     Sunday = 6
     ReservedForFutureUse
}

しかし、どうすれば有効な値を定義できますReservedForFutureUseか? 理想的には、次のようなことをしたいと思います:

public enum DaysOfWeek
    {
         Monday = 0,
         Tuesday = 1,
         Wednesday = 2,
         Thursday = 3,
         Friday = 4,
         Saturday = 5,
         Sunday = 6
         ReservedForFutureUse = {7,8,9,10,11,12,13,14,15}
    }

この問題は、より複雑なフィールドでのみ悪化します。たとえば、この場合、7 と 8 の両方が同じエラー ケースまたは何かにマップされているとします。C#列挙でこの要件をどのように捉えることができますか?

4

2 に答える 2

4

列挙型の面白い癖の 1 つは、特定の列挙型として定義された変数が、その列挙型のどのメンバーによっても定義されていない値を保持できることです。

public enum DaysOfWeek
{
     Monday = 0,
     Tuesday = 1,
     Wednesday = 2,
     Thursday = 3,
     Friday = 4,
     Saturday = 5,
     Sunday = 6
}

// in other code
DaysOfWeek someDay = (DaysOfWeek)42; // this is perfectly legal

これは、表示される可能性のある値をすべて定義する必要はなく、コードにとって意味のある値を指定するだけでよいことを意味します。次に、いくつかの「キャッチオール」ifまたはswitchブロックを使用して、未定義の値を処理できます。

switch (someDay)
{
    case DaysOfWeek.Monday:
    {
        // do monday stuff
        break;
    }
    case DaysOfWeek.Tuesday:
    {
        // do tuesday stuff
        break;
    }
    // [...] handle the other weekdays [...]
    default:
    {
        // handle undefined values here
        break;
    }
}
于 2013-03-11T15:27:32.707 に答える
3

enum特定の基礎となる値は複数の値にマップされる場合がありますが、enum値は 1 つの基礎となる値を持つことができます。

あなたはこれを行うことができます

public enum DaysOfWeek
{
     Monday = 0,
     Tuesday = 1,
     Wednesday = 2,
     Thursday = 3,
     Friday = 4,
     Saturday = 5,
     Sunday = 6
     Reserved1 = 7
     ...
     Reserved8 = 15
}
于 2013-03-11T15:02:01.483 に答える