私は列挙型を持っていますFoo
:
public enum Foo { Alpha, Bravo, Charlie }
int
ボックス化された から への次のキャストを試みると、Foo?
が得られますInvalidCastException
。
var x = (Foo?)(object)1;
これは私にいくつかの実験をもたらしました...
var x = (Foo)(object)1; // succeeds
var x = (long)(object)1; // fails
var x = (long?)(object)1; // fails
var x = (long)1; // succeeds
var x = (long?)1; // succeeds
var x = (int)(object)1; // succeeds
var x = (int?)(object)1; // succeeds
これが私に伝えていることは、ボックス化int
されたものから列挙型にキャストすることはできますが、にキャストlong
することはできず、ボックス化int
されたものからint?
.
ところで、最初に to をキャストする理由は、int
次のように からジェネリック パラメータobject
にキャストしようとしているからです。int
TValue
var x = (TValue)(object)1;
がなければ(object)
、コンパイルされません。(詳細については、Eric Lippert によるこのブログ投稿を参照してください。)
質問
ボックス化
int
されたものから列挙型に変換できるのに、null 許容列挙型に変換できlong
ないのはなぜlong?
ですか?var x = (TValue)(object)1;
コンパイルし、実行時に動作し、パフォーマンスが向上するように書き換える最も簡単な方法は何ですか(実行時TValue
に a であると判断されたと仮定Foo?
します)。