为什么我们不能从C#中的枚举实例访问枚举值?

时间:2012-08-12 08:03:41

标签: c# java enums

这可能会被投票,但这个问题从昨天起一直困扰着我......直到我找到一个链接然后我知道我并不是真的疯了哈哈: Enum as instance variables

我基本上是在质询OP的问题。给出:

enum Coffee {
    BIG,
    SMALL }

public class MyClass {
    private Coffee coffee;

    // Constructor etc.
}

虽然这是Java,但两种语言的枚举确实有所不同,它是怎么回事 我不能做咖啡。大咖啡.BIG.SMALL(虽然在阅读它时没什么意义,但应该可以考虑在咖啡中使用咖啡类型)?

2 个答案:

答案 0 :(得分:10)

这与枚举无关。这通常与访问静态成员有关。

Java有一个设计缺陷(IMO),它允许您通过该类型的表达式访问静态成员,就好像它们是实例成员一样。它可能导致非常令人困惑的代码:

Thread thread = new Thread(...);
thread.start();
// This looks like it makes the new thread sleep, but it actually makes the
// current thread sleep
thread.sleep(1000);

此外,没有无效检查,因为表达式的无关紧要:

Thread thread = null;
thread.sleep(1000); // No exception

现在,请考虑枚举值是隐式静态的,您可以看到为什么存在差异。

你已经承认“在阅读它时没有多大意义”这一事实表明你内心同意这是Java中的一个缺陷,而不是在C#中:)

答案 1 :(得分:4)

在C#中(与Java不同),通过该类的实例访问静态字段是不合法的。

如果你这样写:

coffee.BIG.SMALL

然后你得到的错误是:

  

使用实例引用无法访问成员'coffee.SMALL';使用类型名称来限定它

此代码也不会出于同样的原因:

void Foo(coffee c)
{
    // Member 'coffee.SMALL' cannot be accessed with an instance reference
    Console.WriteLine(c.SMALL); 
}