鉴于下面的代码,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)
是的,如果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)
然后,如果他们得到一个例外,它将落在他们身上以指定正确的大小类型......