2009-12-06 8 views
6

Enumを受け取り、uintにキャストする関数を作成しています。 intにキャストするときに見たことから、最初にオブジェクトにキャストする必要があります。(int) (object) myEnumValue(int) myEnumValueと書くと、コンパイル時に例外が発生します。列挙型をuintにキャストする

今、私はそれをuintにキャストしようとしたとき、私は(uint) (object) myEnumValueが問題ないと期待していました。うまくコンパイルされますが、実行するとInvalidCastExceptionが生成されます。だから私はこれをうまく利用するために使用しました

(uint) (int) (object) myEnumValue 

私はそれが面白そうだと思うので、とても幸せですが、なぜそうですか?

多分uintobjectをキャストすることはできません理由を尋ねるために、より正確だったでしょうが、私はuintEnumから行くために別の方法があるかどうかに興味があります。ある?

編集:

コンテキストは関数であり、このような何か:

public static uint ToUInt (Enum e) 
{ 
    return (uint) (int) (object) e; 
} 

編集2:thecoopで述べたように

が最善の解決策でした

Convert.ToUInt32(e) 

答えて

13

(uint) (object) myEnumのアプローチは、デフォルトではC#enumsが基底型としてintを使用し、intがボックス化されたときのものです。 C#の構文は、基底型(例えば、enum MyEnum : uintなど)から継承したenumのように見えます。

明示的intからuintに数値変換を行い、その後、最初のobjectからintにVHS版にコンパイラに指示する必要があります。 (構文は同じであっても、objectからの値型をボックス化解除するintuint間のキャストは異なるプロセスである。)

+0

私がEnum:uintとしてEnumを指定した場合、それは逆の方法でしょうか? –

+0

@ Jonatan:はい、その列挙型をuintとして囲み、強制的にuintとしてunboxする必要があります。 –

+0

そうです。(uint)eはうまくいくが、(int)eは爆発するだろう。 –

5

int型にキャストする場合、私が見たものから、あなたはそれをキャストする必要があり最初にオブジェクトに:(int) (object) myEnum(int) myEnumと書くと、コンパイル時に例外が発生します。

列挙型の値を整数型に直接キャストすることができます。

今、私はそれをuintにキャストしようとしたとき、私は(uint)(オブジェクト)myEnumが問題ないと思っていました。うまくコンパイルされますが、実行するとInvalidCastExceptionが生成されます。だから、それを働かせるために、私は使った: (uint) (int) (object) myEnum
私はそれが面白そうだと思うので、私はとても幸せですが、なぜそうですか?

あなたはobjectに列挙値をキャストすると、それはデフォルトでintでその基になる型、と箱詰めされます。boxed値を実際の型以外の型に直接unboxすることはできません。でも、これは失敗します。

あなたが基になる型から特定の種類の列挙に、つまり、反対方向に行く必要がある場合には
short s = 10; 
object o = s; 
int i = (int)o; // throws `InvalidCastException` while `int i = (int)s;` works. 
0

:私はこれがあることが判明

enum MyEnumType { a, b, c }; 
//... 
MyEnumType enum_val = (MyEnumType)Enum.ToObject(typeof(MyEnumType), 2); 
Console.WriteLine(enum_val == MyEnumType.c); 
// "True" 

をジェネリック型をオーサリングする場合(単純なキャスティングではなく)必要です。列挙型に汎用の<T>を十分に拘束するためにwhere句を使用することはできないので、コンパイラは数値をキャストすることはできません。