给定下面的代码,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/