C# 为什么动态强制转换抛出异常?
我有一个枚举:C# 为什么动态强制转换抛出异常?,c#,casting,type-conversion,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'. 为什么动
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,这是与所允许的显式类相同的一组
长答覆:
在引擎盖下,Convert.ChangeType方法将调用
这将依次调用内部方法Convert.DefaultToType,该方法将处理预定义的类型列表,并从IConvertible调用相应的方法,例如,如果您请求DateTime,它将调用。然而,从你的角度来看,这里有一个有趣的例子:
if (targetType == Convert.EnumType)
{
return (Enum)value;
}
您可能认为这将允许您的代码工作。但是,它不会-枚举的类型不是-它是它的一个子类。简短回答:
Convert.ChangeType只能将内置类型转换为预定义的类集。对于Int32,这是与所允许的显式类相同的一组
长答覆:
在引擎盖下,Convert.ChangeType方法将调用
这将依次调用内部方法Convert.DefaultToType,该方法将处理预定义的类型列表,并从IConvertible调用相应的方法,例如,如果您请求DateTime,它将调用。然而,从你的角度来看,这里有一个有趣的例子:
if (targetType == Convert.EnumType)
{
return (Enum)value;
}
您可能认为这将允许您的代码工作。但是,它不会-枚举的类型不是-它是该类型的一个子类。您的想法是什么:iftargetType.IsEnumEnum.ToObjecttargetType,value?@RezaArab这是框架代码-您不能修改它。我刚才解释了引发异常的原因。您的想法是什么:iftargetType.IsEnum Enum.ToObject TargetType,value?@RezaArab这是框架代码-您不能修改它。我刚才解释了为什么会抛出异常。