c# - 枚举整数转换异常可能吗?

标签 c# casting enums

给定下面的代码,int 转换是否有可能抛出异常?

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

最佳答案

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

    public enum X : long
    {
        A,
        B,
        C
    }

这会抛出。这是因为 enum 值是作为 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);                      
        }
    }
}

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

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

或者,如果有符号,你可以假定一种类型为 long,如果没有符号,则假定为 ulong(你可以有负的 enum 值,但倾向于更稀有):

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

这就是为什么做出一些假设并在通话中检查它们可能更安全的原因。您为值拆箱所做的任何操作都有可能抛出或溢出。

您甚至可以采用通用方式,让用户输入他们想要退出的类型:

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));
        }
    }
}

所以你可以调用这个:

IEnumerable<int> values foo<int>(typeof(YourEnum));

然后,如果他们遇到异常,则由他们指定正确的尺寸类型...

关于c# - 枚举整数转换异常可能吗?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/7728483/

相关文章:

c# - 更新 mongodb 文档中的特定字段

c# - 如何自定义MAUI ContentPage的导航标题 View

c# - IsAssignableFrom 与 COM

c - 如何传递枚举名称直接切换,vc++ mfc

c# - KeyValuePair<string,object> 对象是否可枚举?

c# - 获取不在间隔内的小时列表

c - 在自定义结构中管理可动态分配的数组

java - 隐式转换与显式转换

java - 由 : java. lang.ClassNotFoundException : com. mcruiseon.common.Globals.RideType 引起

java - 我应该测试枚举吗?