11

私は次のような列挙型を持っています:

public enum Test:int
{
   A=1, 
   B=2
}

ここで、列挙型が int 型であることはわかっていますが、次のようなことをしたい場合:

int a = Test.A;

これは機能しません。

次のようなクラスがある場合:

public class MyTest
{
    public static int A =1;
}

私は言うことができます、

int a = MyTest.A;

Aここでは明示的に intにキャストする必要はありません。

4

5 に答える 5

18

ここで、列挙型が int 型であることを知っています

いいえ、ちがいます。の基になる型がintありますが、別の型です。一体、それはそもそも列挙型を持つことのポイントの半分です-型を別々に保つことができます。

列挙型の値とそれに相当する数値との間で変換を行う場合は、キャストします。これはそれほど面倒なことではなく、タイプ セーフの観点からコードをよりクリーンに保ちます。基本的には、それが正しいことであることがまれであるため、明示的にすることが適切になるものの1つです。

編集: 注意すべき奇妙な点の 1 つは、定数値 0 から列挙型への暗黙的な変換があることです。

Test foo = 0;

実際、MS 実装では、任意の種類の定数 0にすることができます。

Test surprise = 0.0;

これはバグですが、修正するには遅すぎます:)

この暗黙的な変換の残りの部分は、フラグ列挙型にビットが設定されているかどうかのチェックと、「0 値」を使用するその他の比較を簡単にすることだったと思います。個人的に私はその決定の支持者ではありませんが、少なくとも知っておく価値はあります。

于 2012-08-15T12:01:23.040 に答える
3

列挙値はint型ではありません。int列挙型の基本型です。列挙型は技術的には int ですが、論理的には (C# 言語の観点から) そうではありません。int( System.Int32) は、明示的に別の列挙型を指定しない場合、デフォルトですべての列挙型の基本型です。

于 2012-08-15T12:01:51.123 に答える
3

あなたの更新された例では:

public class MyTest
{
    public static int A =1;
}

そして使用法:

int a = MyTest.A;

それは列挙型の外観ではありません。列挙型は次のようになります (コメントは、実際の列挙型とは異なる場所です):

public struct MyTest /* Of course, this isn't correct, because we'll inherit from System.ValueType. An enum should inherit from System.Enum */
{
    private int _value; /* Should be marked to be treated specially */
    private MyTest(int value) /* Doesn't need to exist, since there's some CLR fiddling */
    {
       _value = value;
    }

    public static explicit operator int(MyTest value) /* CLR provides conversions automatically */
    {
       return value._value;
    }
    public static explicit operator MyTest(int value) /* CLR provides conversions automatically */
    {
       return new MyTest(value);
    }

    public static readonly MyTest A = new MyTest(1); /* Should be const, not readonly, but we can't do a const of a custom type in C#. Also, is magically implicitly converted without calling a constructor */

    public static readonly MyTest B = new MyTest(2); /* Ditto */
}

はい、「基になる」 int 値に簡単Aにアクセスできますが、との値Bは依然として type として強く型付けされていMyTestます。これにより、不適切な場所で誤って使用することがなくなります。

于 2012-08-15T12:39:42.463 に答える
2

あなたの列挙型はタイプTestです。int列挙型に整数値があるという理由だけではありません。

列挙型をキャストして int 値を取得できます。

int a = (int) Test.A;
于 2012-08-15T12:02:24.087 に答える