2

私は列挙型を持っています:

enum MyEnum
{
    First,
    Second
}

intを列挙型にキャストできます:

var sample1 = (MyEnum)1;

しかし、これで動的変換の例外が発生しました:

var sample2 = System.Convert.ChangeType(1, typeof(MyEnum));
//Invalid cast from 'System.Int32' to 'ConsoleApplication1.Program+MyEnum'.

なぜ動的キャストが例外をスローするのですか?

私は解決策を探していません。例外がスローされる理由を知りたいのですが。

ありがとう

4

1 に答える 1

4

簡単な答え:Convert.ChangeTypeは、組み込みの型を事前定義されたクラスのセットにのみ変換できます。Int32の場合、これはIConvertibleで許可されているものと同じ明示的なクラスのセットです。

長い答え:内部では、Convert.ChangeTypeメソッドはInt32.IConvertible.ToTypeを呼び出します。

これにより、事前定義されたタイプのリストを処理する内部メソッドConvert.DefaultToTypeが呼び出され、IConvertibleから適切なメソッドが呼び出されます(たとえば、DateTimeを要求した場合は、ToDateTimeが呼び出されます)。しかし、あなたの観点からすると、そこには興味深いものがあります。

if (targetType == Convert.EnumType)
{
    return (Enum)value;
}

あなたはあなたのコードが機能することを可能にするだろうと思うかもしれません。ただし、そうではありません-列挙型のタイプはSystem.Enumではありません-それはそのサブクラスです。

于 2013-02-26T11:47:04.417 に答える