为什么动态投掷抛出异常?

时间:2013-02-26 11:31:26

标签: c# casting type-conversion

我有一个枚举:

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'.

为什么动态投掷抛出异常?

我不是在寻找解决方案,只是想知道抛出异常的原因?

由于

1 个答案:

答案 0 :(得分:4)

简短回答: Convert.ChangeType只能将内置类型转换为预定义的类集。对于Int32,这是IConvertible允许的同一组显式类。

答案很长: 在引擎盖下,Convert.ChangeType方法将调用Int32.IConvertible.ToType

这将依次调用内部方法Convert.DefaultToType,该方法将通过预定义的类型列表工作,并从IConvertible调用适当的方法(例如,如果您请求DateTime,它将调用ToDateTime )。但是,从你的观点来看,有一个有趣的:

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

您可能认为您的代码可以使用。但是,它不会 - 你的枚举类型不是System.Enum - 它是它的子类。