Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/314.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 为什么动态强制转换抛出异常?_C#_Casting_Type Conversion - Fatal编程技术网

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这是框架代码-您不能修改它。我刚才解释了为什么会抛出异常。