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

问题描述:

这可能会downvoted,但这个问题一直困扰着我,因为昨天..直到我找到了一个链接,然后我就知道我是不是真的疯了笑: Enum as instance variables为什么我们不能从C#中的枚举实例访问枚举值?

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

enum Coffee { 
    BIG, 
    SMALL } 

public class MyClass { 
    private Coffee coffee; 

    // Constructor etc. 
} 

虽然这是Java和枚举也有所不同两种语言是什么让 我不能做coffee.BIG或coffee.BIG.SMALL(尽管它没有什么意义阅读时,应该可以考虑在C#中使用咖啡类型)?

这是不是真的有枚举做。这与通常访问静态成员有关。

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#:)

+0

哦,是的,这使得现在完整的感觉。最后一个答案! :P – 2012-08-12 08:12:39

在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); 
} 
+3

+1,并在其纯混乱Java的。 – 2012-08-12 08:08:06

+0

使完美的感觉,谢谢:) – 2012-08-12 08:14:01