2012-01-25 6 views
0

のC#のキャストは、あなたは、このようなC#非整数列挙型と

public enum Animals 
{ 
    Dog = 0, Cat = 1, 
} 

としてあなたの列挙型の要素に値を割り当てることができます、あなたはとても似すぎて、そこからキャストすることができます。

public void demo() 
{ 
    int dog = (int)Animals.Dog; 
    Animals cat = (Animals)(dog++); 
} 

が、C#はまた、あなたがキャストでバックとアウトベクトル2を得ることができませんしかし、あなたはこの

public enum Animals 
{ 
    Dog = Vector2.One, Cat = Vector2.Zero, 
} 

ようなことを行うことができます。

Vector2 dog = (Vector2)Animals.Dog; //this fails 

この問題は解決できますか? * Vector2はクラスオブジェクトであり、Vector2.OneVector2.Zeroはそのような静的宣言です。これはDogがメモリ参照に割り当てられていることを意味します。整数型へVector2からの暗黙的なキャストがある場合

+2

このコードはコンパイルされません - 'Vector2'はint型に変換可能でなければなりません(または、整数型のみであるenumの他のいずれかの型を指定した場合) – BrokenGlass

+0

Vector2はクラスではありません。値の型(あなた自身の実装ではなく、XNA Vector2を使用していると仮定します)。 – smelch

+0

@BrokenGlassええ、私のKreskin帽子(http://www.amazingkreskin.com/)もクリーナーで出ています! ;-) –

答えて

2

C#はあなたが

public enum Animals 
{ 
    Dog = Vector2.One, 
    Cat = Vector2.Zero 
} 

を行うようになる唯一の方法です。そうしないと、コンパイルエラーが発生します。これはVector2にキャストできない理由です。intからVector2に戻るキャストはありません。 DogおよびCatは整数値であり、値はそれぞれVector2.OneおよびVector2.Zerointの暗黙的キャストに由来します。

あなたはそれを動作させるためにあなた自身の明示的なキャストを定義することができますが、私はあなたがそのようにしたいすべての情報を取り戻すことはできないと推測しています。

+0

これは本当です。これはコンパイラではなく、プリコンパイラに渡されました。これは今より意味をなさない。 – ohmusama