5

私は列挙型を持っています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にキャストしようとしているからです。intTValue

var x = (TValue)(object)1;

がなければ(object)、コンパイルされません。(詳細については、Eric Lippert によるこのブログ投稿を参照してください。)

質問

  1. ボックス化intされたものから列挙型に変換できるのに、null 許容列挙型に変換できlongないのはなぜlong?ですか?

  2. var x = (TValue)(object)1;コンパイルし、実行時に動作し、パフォーマンスが向上するように書き換える最も簡単な方法は何ですか(実行時TValueに a であると判断されたと仮定Foo?します)。

4

2 に答える 2

5

最初の質問に答えるために、ボックス化された値が列挙型の基になる型である場合にのみ、ボックス化された値から列挙型に変換できます。宣言したのか

enum Foo : byte { ...

boxed int から Foo にキャストすることはできません。

2 番目の質問に答えるには、

var x = (TValue)Enum.ToObject(typeof(TValue), 1);

ただし、これにはボクシングが含まれます。ボックス化しないソリューションが必要な場合は、さらに複雑になります。

于 2012-09-06T00:15:23.690 に答える
1

Nullable は、アトミック型の特別なカテゴリではありませんが、 type の省略形ですNullable<T>。そのため、ボックス化された int を null 許容列挙型にキャストすることはできません。null 許容列挙型を作成する場合は、次のように実行できます。

var x = new Nullable<Foo>((Foo)1);

これはあなたの両方の質問に答えていると思います!

于 2012-09-05T23:51:09.530 に答える