2

私は現在、次のように定義された列挙型を持っています:

public enum ColorEnum { Red, White, Blue, Green };

これらの列挙値のそれぞれには、ユーザーに返すことができるようにする必要がある基になるint値があります。そのために、列挙型を取り込んでintを返す関数を作成しました。

public int colorToValue(ColorEnum color)
{
    switch (color)
    {
        case Red:
            return 5;
        case White:
            return 10;
        case Blue:
            return 15;
        case Green:
            return 20;
    }

    return 0;
}

これはうまく機能しますが、列挙型自体を使用して基になる値を格納することで、物事を単純化できるかどうか疑問に思いました。たとえば、列挙型を次のように定義できますか?

public enum ColorEnum { Red = 5, White = 10, Blue = 15, Green = 20 };

次に、列挙型をその基になる値に変換するのは、intにキャストするのと同じくらい簡単です。上記の関数は、次のように簡略化されます。

public int colorToValue(ColorEnum color)
{
    return (int)color;
}

もちろん、列挙型エントリの値は、列挙型定義で要求されるintである必要があります。

ありがとう!

4

1 に答える 1

5

はい、それは完全に有効であり、正常に機能します。列挙型は、基になる型との間でクリーンにキャストされます。列挙型は、1,2,3 ...だけでなく、指定された値を持つことが非常に一般的です。

ただし、注意すべきことは、その逆も当てはまるということだけです。したがって、これは正常に機能します。

ColorEnum evil = (ColorEnum)(-53); // why not...

これに対して元の colorToValue(evil)コードが返さ0れます。新しいコードはを返し-53ます。個人的に私はを投げたかもしれませんArgumentOutOfRangeException

Enum.IsDefined方法もありますが、それは値をボックス化することを含みます。ただし、入力が期待値であることを確認たい場合は、少なくとも次のように簡略化できます。

public int colorToValue(ColorEnum color)
{
    switch (color)
    {
        case Red:
        case White:
        case Blue:
        case Green:
            return (int)color;
        default:
            return 0; // or throw, whatever
    }
}
于 2012-08-21T09:49:49.267 に答える