我有下面的代码,其中有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();
}
`
答案 0 :(得分:2)
您的SomeFunction
签名目前已被指示接受任何“枚举”数据类型,SomeEnum
和SomeOtherEnum
都是。
更改您的签名:
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();
}