可能 System.InvalidCastException 将 Enum 转换为 int?

Possible System.InvalidCastException casting Enum to int?

我有以下代码片段:

internal static class Program
{
    private enum MyEnum
    {
        MyVal = 2,
    }
    private enum AlsoMyEnum
    {
        AlsoMyVal = 2,
    }
    private static class Thing
    {
        public static object DoThing(object objectIn) =>
            objectIn is Enum ? (int)objectIn : objectIn;
    }
    [STAThread]
    private static void Main(string[] args)
    {
        var objectOut = Thing.DoThing(MyEnum.MyVal);
        var objectOut2 = Thing.DoThing(AlsoMyEnum.AlsoMyVal);
        var @false = MyEnum.MyVal.GetType() == AlsoMyEnum.AlsoMyVal.GetType();
        var @true = objectOut.GetType() == objectOut2.GetType();
    }
}

ReSharper 抱怨“(int)objectIn”是 "Possible 'System.InvalidCastException'"。

根据我的理解,这段代码很好(因此,我应该取消警告)- 如果某物是 Enum,那么将其转换为 int 应该是有效的。但是,我想检查一下 - 我是否遗漏了什么?

警告是否正确?或者是否有其他方法可以避免警告,同时仍然将 int 放入 parameter.Value?

编辑

感谢@InBetween 指出警告实际上是正确的。为了修复代码,应该改用:

        public static object DoThing(object objectIn) => objectIn is Enum
            ? Convert.ChangeType(objectIn, Enum.GetUnderlyingType(objectIn.GetType()))
            : objectIn;

盒装枚举只能转换为其基础类型。这将失败:

enum LongEnum: long
{
    Woops
}

object o = LongEnum.Woops;
var i = (int)o;

这是由于一条更通用的规则:任何装箱的值类型只能拆箱为其类型:

object o = 1; //boxed int
var s = (short)o; //fails

您可以尝试下面给出的答案中提到的代码 C# Iterating through an enum? (Indexing a System.Array)

这里的主要目的是要知道每个枚举值都有两部分 - 名称和值。值可以转换为整数。

Enum.GetValues return 该枚举中所有值的数组。如果你只想要这个,那么只需要第一行代码。

    public enum MyEnum
    {
        First,
        Second,
        Third
    }

    private void EnumValues()
    {

        Array values = Enum.GetValues(typeof(MyEnum));

        foreach (MyEnum val in values)
        {
            //// To print name and value in enum
            Console.WriteLine(String.Format("{0}: {1}", Enum.GetName(typeof(MyEnum), val), val));


            //// To get only value
            int i = (int)val;
        }
    }

希望对您有所帮助。

假设您使用的是 C#7,您可以将模式匹配的结果分配给一个变量。

如果您有这样的枚举:

public enum TestEnum
{
    A = 1,
    B = 2,
    C = 3
}

然后你可以使用

来处理它
if (param.Value is TestEnum enumValue)
{
    parameter.Value = (int)enumValue;
}

你不能将 System.Enum 转换为 int,所以如果你的示例反映了你的实际代码,它实际上不会编译。