2012-08-12 177 views
6

這可能會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#中使用咖啡類型)?

回答

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

+0

哦,是的,這使得現在完整的感覺。最後一個答案! :P – 2012-08-12 08:12:39

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

+1,並在其純混亂Java的。 – 2012-08-12 08:08:06

+0

使完美的感覺,謝謝:) – 2012-08-12 08:14:01