将特定枚举传递给Enum类

时间:2015-10-07 12:19:12

标签: c# enums

我有下面的代码,其中有2个枚举和一个以基类Enum为参数的函数,将常规枚举强制转换为SomeEnum并显示它。我希望当你在函数中传递SomeOtherEnum时,会抛出一个InvalidCastException,因为我怀疑编译器为每个枚举生成另一个类型。然而,从行为来看,似乎编译器具有单个生成的类类型,并且每个实例具有不同的参数(枚举)。它是否正确?如果没有,为什么有可能通过看似不兼容的类型,编译器不会抱怨?

'

enum SomeEnum
{
    X1,
    X2, 
    X3
}

enum SomeOtherEnum
{
    X1,
    X2,
    X3,
    X4,
    X5
}

public static void SomeFunction(Enum someEnum)
{
    SomeEnum x = SomeEnum.X3; // some dummy init
    try
    {
        x = (SomeEnum) someEnum;
    }
    catch (InvalidCastException) 
    {
        Console.WriteLine("Exception"); // why no exception caught ? why legit cast ?
    }
    Console.WriteLine(x);
}
    private static void Main(string[] args)
    {
        SomeFunction(SomeOtherEnum.X5); // pass a different type than the one in the function
        Console.ReadKey();
    }

`

4 个答案:

答案 0 :(得分:2)

您的SomeFunction签名目前已被指示接受任何“枚举”数据类型,SomeEnumSomeOtherEnum都是。

更改您的签名:

public static void SomeFunction(Enum someEnum)

public static void SomeFunction(SomeEnum someEnum)

您对SomeFunction(SomeOtherEnum.X5)的来电将成为错误。

答案 1 :(得分:2)

枚举基本上是整数命名,一些编译器时间检查。仍然有很多方法可以欺骗编译器接受枚举的无效值,例如:

public enum First {
   One = 1, 
   Two = 2
}

First first = (First) 3;

是完全有效的代码。

所以行x = (SomeEnum) someEnum有效,因为它基本上执行为:

 x = (SomeEnum) (Enum) SomeOtherEnum.X5;

两个演员阵容中的每一个都是有效的,即使它们产生了一个有意义的值。

恕我直言,枚举是C#设计团队完全放弃球的地方 - 它们与整数有很大的不同,你必须以不同的方式处理它们,但又不足以让它们自己理解。

答案 2 :(得分:1)

在幕后,Enums基本上只是命名为整数。

因此,当你有一个Enum对象(IE是所有枚举的基本类型)时,你可以自由地转换为任何继承的类型。

请参阅this question,了解有关其为什么不是无效演员的详细信息。

答案 3 :(得分:0)

enum SomeEnum {
    X1,
    X2, 
    X3
}

enum SomeOtherEnum
{
    X1,
    X2,
    X3,
    X4,
    X5
}

public static void SomeFunction(SomeEnum someEnum))

{

    SomeEnum x = SomeEnum.X3; // some dummy init
    try
    {
        x = (SomeEnum) someEnum;
    }
    catch (InvalidCastException) 
    {
        Console.WriteLine("Exception"); // why no exception caught ? why legit cast ?
    }
    Console.WriteLine(x);
}
    private static void Main(string[] args)
    {
        SomeFunction(SomeOtherEnum.X5); // pass a different type than the one in the function
        Console.ReadKey();
    }