2012-02-17 7 views

答えて

9

列挙型は単なるint型であるため、2番目の値はEnum1の値を返しますが、実際にはこれらの値は01です。これらの値をタイプEnum2にキャストすると、これらの値は引き続き有効で、値 "A"と "B"に対応します。

+1

もちろん、彼らは...愚かな私!私はC#enumsが実際には素晴らしいintsであることを忘れてしまった。私は、本格的なクラスであるJavaのenumにもっと慣れていました。コンパイラがそれをキャッチしていないのは残念です... – JohnDoDo

+6

@JohnDoDo: "foreach(Enum2 e ..."は**明示的な**変換を行います - キャスト、効果的に - からコンパイラがキャッチしませんループ変数の型にコレクション型を渡すことができます。*(Enum2)enum1'をキャストすることは合法です。* foreach *で暗黙的に同じことをすることは合法です。 –

3

Enum.GetValues()を使用すると、基になる値が返されます。 foreach(Type...)を使用すると、列挙型にキャストされます。したがって、それらは同じEnumではないかもしれませんが、問題のないキャストを持つ同じ基本値を持ちます。この

int value = Enum.GetValues(typeof(Enum2))[1]; // this isn't valid code, it's more simplified 
Enum1 casted = (Enum1)value; 
8

とほぼ同じで何が起こっている

あなたの列挙型の値が暗黙的に整数ですので:

public enum Enum1 
{ 
    ONE = 0, 
    TWO = 1 
} 

public enum Enum2 
{ 
    A = 0, 
    B = 1 
} 

Enum1の値は暗黙的に整数に変換し、その後値とされていますEnum2の...

public enum Enum1 
{ 
    ONE = 0, 
    TWO = 1, 
    THREE = 2, 
} 

を次のようにEnum1を再定義した場合は、整数値であり2

+1

列挙型の値は0から始まり、実際には 'A、B、2'を出力します。文字列のArrayListを持っていれば、' foreach(myArrayListのstring s) 'と言うことができます。失敗するのではなく - [C#の列挙型へのキャスト](http://stackoverflow.com/questions/1758321/casting-ints-to-enums-in-c-sharp)を参照してください。 – Justin

+0

@Justinは修正しました。 –

1

ためEnum2に値がないので...それはは、は「A、B」を返さない失敗しますEnum1 - > intとint - > Enum2の暗黙のキャストです。

0

これは、列挙型が暗黙的にSystem.Intにキャスト可能であることを示しています(これらはint型のenumであると仮定します)。

あなたの2番目のforeachは、Enum.GetValues(typeof(Enum1))の結果を明示的にEnum2にキャストしています。

2

Enum.GetValues(typeof(Enum1))リターン{0,1}とforeachがこの範囲に

1

を列挙します私はジョンスキートのような人がここに来て、完全に、より良い私よりも何が起こっているのかを説明できると思いますが、このコードになります。

foreach (Enum2 e in Enum.GetValues(typeof(Enum1))) 
{ 
    Console.WriteLine(e); 
} 

... Enum1の値はすべてEnum2タイプとなっています。

enumデータ型はintデータ型のようなものですので、Enum1からあなたの数値は、インデックスEnum2に使用されています。

関連する問題