为什么动态铸造会抛出异常

本文关键字:抛出异常 动态 为什么 | 更新日期: 2023-09-27 18:01:04

我有一个枚举:

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

为什么动态铸造会抛出异常?

我不是在寻找解决方案,只是想知道为什么会抛出异常?

感谢

为什么动态铸造会抛出异常

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

长答案:在后台,Convert.ChangeType方法将调用Int32.IConvertible.ToType.

这将反过来调用内部方法Convert.DefaultToType,该方法将通过预定义的类型列表工作,并从IConvertable中调用适当的方法(例如,如果您请求DateTime,它将调用ToDateTime(。然而,从你的角度来看,有一个有趣的问题:

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

您可能认为这将允许您的代码工作。然而,它不会——你的枚举类型不是System.enum——它是它的一个子类。