【问题标题】:Why dynamic casting throw exception?为什么动态转换抛出异常?
【发布时间】:2013-02-11 20:08:35
【问题描述】:

我有一个枚举:

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

为什么动态转换抛出异常?

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

谢谢

【问题讨论】:

    标签: c# casting type-conversion


    【解决方案1】:

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

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

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

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

    您可能认为这会让您的代码正常工作。但是,它不会 - 您的枚举类型不是 System.Enum - 它是它的子类。

    【讨论】:

    • 你的想法是什么:if(targetType.IsEnum) (Enum)Enum.ToObject(targetType, value)?
    • @RezaArab 这是框架代码 - 你不能修改它。我只是在解释为什么抛出异常。
    猜你喜欢
    • 2021-09-25
    • 2019-06-13
    • 2010-12-09
    • 1970-01-01
    • 2012-04-13
    • 2011-01-04
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多