2

我有一个枚举:

enum MyEnum
{
    First,
    Second
}

我可以将 int 转换为 Enum:

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 回答