我有一个枚举:
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'.
为什么动态投掷抛出异常?
我不是在寻找解决方案,只是想知道抛出异常的原因?
由于
答案 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 - 它是它的子类。