我在这里很困惑。假设我在Visual Studios中有两个程序 - 我使用的是C#WPF。假设我有两个程序,其中程序1将程序2作为参考 - 同样程序2将程序1作为参考。
Program1.sol
p1.xaml.cs 内容:
public void checkStuff(myThing x)
{
// Do stuff (irrelevant)
}
public enum myThing
{
stuff,
stuff2,
stuff3,
stuff4
}
Program2.sol
p2.xaml.cs 内容:
// Let's say I call that function
p1 p1content = new p1();
p1content.checkStuff(0); // <-- Why does this work??
我的问题是,为什么数字 0 作为参数?这可能是微不足道的,但是当我传入0时程序认为我正在通过该函数到底是什么?起初我以为它是我的枚举类中变量的索引,但它不能因为我不能通过1,2或3等。
答案 0 :(得分:3)
默认情况下,在C#中,enum
的基础类型为int
。请参阅MSDN documentation。
正如this SO post中的评论所述:
enum关键字用于声明枚举,一种不同的类型 由一组名为常量的枚举器列表组成。 每个枚举类型都有一个底层类型,可以是任何类型 除了char之外的整数类型。
枚举有一个基于整数的值作为基数(int,byte,ulong等)。编译器仅接受零的赋值,以保证即使没有为枚举属性分配显式值,也可以初始化基于枚举的类型的变量。但编译器不接受任何其他值。这是一种内置安全性,但更多的是解决编译器设计中的缺陷以解决先前与枚举的不一致行为的妥协。 Eric Lippert的This little story提供了一个洞察它是如何形成的。
答案 1 :(得分:3)
当你声明一个像你问题中的枚举这样的枚举时,实际发生的事情(ish)是:
public enum myThing : int
{
stuff = 0,
stuff2 = 1,
stuff3 = 2,
stuff4 = 3
}
即,enum
的默认基础类型是int
,字段从零开始顺序启动。
奇怪的是,这只适用于零元素,例如:
checkStuff(0);
但这不会
checkStuff(1); //error
你需要明确
checkStuff((myThing)1); //cast int to myThing