Enum Integer Cast异常可能吗?

max*_*axp 1 c# enums casting

鉴于下面的代码,int演员是否有可能抛出异常?

        static void foo(Type typeEnum)
        {
            if (typeEnum.IsEnum)
            {
                foreach (var enumVal in Enum.GetValues(typeEnum))
                {
                    var _val = (int)enumVal;                      
                }
            }
        }
Run Code Online (Sandbox Code Playgroud)

Jam*_*are 5

是的,如果enum支持类型不是int,例如:

    public enum X : long
    {
        A,
        B,
        C
    }
Run Code Online (Sandbox Code Playgroud)

这将抛出.这是因为enum值为box object,并且您不能将'object'强制转换为'int',除非包含的值实际上是'int'.

您可以通过执行Convert.ToInt32()适用于所有支持类型int或更小的支持来缓解此问题:

static void foo(Type typeEnum)
{
    if (typeEnum.IsEnum)
    {
        foreach (var enumVal in Enum.GetValues(typeEnum))
        {
            var _val = Convert.ToInt32(enumVal);                      
        }
    }
}
Run Code Online (Sandbox Code Playgroud)

或者,如果您想要假设int并且只是更安全,您可以检查enum类似的基础类型:

if (Enum.GetUnderlyingType(typeEnum) != typeof(int))
{
    throw new ArgumentException("This method only accepts int enums.");
}
Run Code Online (Sandbox Code Playgroud)

或者,你可以假设一种longif签名或ulong无符号的类型(你可以有负值enum,但往往更少):

static void foo(Type typeEnum)
{
    if (typeEnum.IsEnum)
    {
        foreach (var enumVal in Enum.GetValues(typeEnum))
        {
            var _val = Convert.ToInt64(enumVal);                      
        }
    }
}
Run Code Online (Sandbox Code Playgroud)

这就是为什么做出一些假设并在通话中检查它们可能更安全.你打开这个值所做的任何事都有可能抛出或溢出.

您甚至可以通用并让用户传递他们想要的类型:

static IEnumerable<ToType> foo<ToType>(Type typeEnum)
{
    if (typeEnum.IsEnum)
    {
        foreach (var enumVal in Enum.GetValues(typeEnum))
        {
            yield return (ToType)Convert.ChangeType(enumVal, typeof(ToType));
        }
    }
}
Run Code Online (Sandbox Code Playgroud)

所以你可以调用这个:

IEnumerable<int> values foo<int>(typeof(YourEnum));
Run Code Online (Sandbox Code Playgroud)

然后,如果他们得到一个例外,它将落在他们身上以指定正确的大小类型......