6

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

我基本上是在问与OP的问题相反的问题。鉴于:

enum Coffee {
    BIG,
    SMALL }

public class MyClass {
    private Coffee coffee;

    // Constructor etc.
}

尽管这是 Java 并且枚举在两种语言中确实有所不同,但我怎么不能做 coffee.BIG 或 coffee.BIG.SMALL (虽然在阅读时没有什么意义,但考虑到咖啡是 Coffee 类型应该是可能的) 在 C# 中?

4

2 回答 2

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# 中的缺陷:)

于 2012-08-12T08:06:14.113 回答
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); 
}
于 2012-08-12T08:06:04.873 回答