が値を返すありません代わりに(Enum2 e
をtypeof(Enum1)
と共に使用されるため)失敗の、Aを返し、B:Enum.GetValues(typeof演算(...))は、適切な列挙型は、このコードを考えると
foreach (Enum2 e in Enum.GetValues(typeof(Enum1)))
{
Console.WriteLine(e);
}
なぜですか?
が値を返すありません代わりに(Enum2 e
をtypeof(Enum1)
と共に使用されるため)失敗の、Aを返し、B:Enum.GetValues(typeof演算(...))は、適切な列挙型は、このコードを考えると
foreach (Enum2 e in Enum.GetValues(typeof(Enum1)))
{
Console.WriteLine(e);
}
なぜですか?
列挙型は単なるint型であるため、2番目の値はEnum1
の値を返しますが、実際にはこれらの値は0
と1
です。これらの値をタイプEnum2
にキャストすると、これらの値は引き続き有効で、値 "A"と "B"に対応します。
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;
とほぼ同じで何が起こっている
あなたの列挙型の値が暗黙的に整数ですので:
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
列挙型の値は0から始まり、実際には 'A、B、2'を出力します。文字列のArrayListを持っていれば、' foreach(myArrayListのstring s) 'と言うことができます。失敗するのではなく - [C#の列挙型へのキャスト](http://stackoverflow.com/questions/1758321/casting-ints-to-enums-in-c-sharp)を参照してください。 – Justin
@Justinは修正しました。 –
ためEnum2に値がないので...それはは、は「A、B」を返さない失敗しますEnum1 - > intとint - > Enum2の暗黙のキャストです。
これは、列挙型が暗黙的にSystem.Int
にキャスト可能であることを示しています(これらはint型のenumであると仮定します)。
あなたの2番目のforeachは、Enum.GetValues(typeof(Enum1))
の結果を明示的にEnum2
にキャストしています。
Enum.GetValues(typeof(Enum1))
リターン{0,1}とforeach
がこの範囲に
を列挙します私はジョンスキートのような人がここに来て、完全に、より良い私よりも何が起こっているのかを説明できると思いますが、このコードになります。
foreach (Enum2 e in Enum.GetValues(typeof(Enum1)))
{
Console.WriteLine(e);
}
... Enum1
の値はすべてEnum2
タイプとなっています。
enum
データ型はint
データ型のようなものですので、Enum1
からあなたの数値は、インデックスEnum2
に使用されています。
もちろん、彼らは...愚かな私!私はC#enumsが実際には素晴らしいintsであることを忘れてしまった。私は、本格的なクラスであるJavaのenumにもっと慣れていました。コンパイラがそれをキャッチしていないのは残念です... – JohnDoDo
@JohnDoDo: "foreach(Enum2 e ..."は**明示的な**変換を行います - キャスト、効果的に - からコンパイラがキャッチしませんループ変数の型にコレクション型を渡すことができます。*(Enum2)enum1'をキャストすることは合法です。* foreach *で暗黙的に同じことをすることは合法です。 –