2010-09-10 157 views
3
public enum sEnum 
{ 
    zero = 0, one = 1 
} 

public int x; 

public static void a(sEnum s) 
{ 
    x = 3; 
    if (s == sEnum.one) ... 
} 

为什么可以在这里检查枚举的值,因为不使用static关键字?这在语言规范中记录在哪里?从静态方法访问非静态枚举值

+0

虽然已经回答了问题,但是想告诉一个错误,即当函数a是静态的,那么它如何将值3赋值给非静态成员x。 对不起这个问题的范围,但我无法阻止自己在该行代码上值得注意。 我希望你不会介意。 :) – necixy 2010-09-18 18:00:59

回答

6

枚举是刚刚命名的值,所以你可以在静态上下文中使用它们,就像任何其他常量一样。

语言规范状态的第3.4.3节:

枚举的成员是在枚举中声明的常量

+1

“10.4:即使常量被认为是静态成员,常量声明既不需要也不允许静态修饰符。”结合3.4.3作出令人满意的答案。 – seamast 2010-09-10 19:13:32

+0

@seamast:感谢您的更新。 – 2010-09-10 20:01:14

2

我认为在规格14.3是你在找什么:

枚举成员的命名和作用域的方式与类中的域完全类似。枚举成员的范围是其包含枚举类型的主体。在这个范围内,枚举成员可以用简单的名字来引用。从所有其他代码中,枚举成员的名称必须使用枚举类型的名称进行限定。枚举成员没有任何声明的可访问性 - 如果枚举类型的枚举类型可访问,则枚举成员是可访问的。