2012-08-12 11 views
6

私はリンクを見つけるまで、私は大爆笑だ、私は本当にクレイジーではないことを知っていた。これは、downvotedてしまうかもしれませんが、この質問は昨日から私を悩ませてきた。 Enum as instance variablesなぜC#のenumインスタンスからenum値にアクセスできないのですか?

私は基本的にはOPのの反対を求めています質問。考える:それを読むとき、それはほとんど意味がないにもかかわらず

enum Coffee { 
    BIG, 
    SMALL } 

public class MyClass { 
    private Coffee coffee; 

    // Constructor etc. 
} 

これはJavaと列挙型ですが(それは 私がcoffee.BIGまたはcoffee.BIG.SMALLを行うことができないということですか両方の言語で多少異なります、コーヒーがコーヒーのタイプであると考えることができるはずです)。

答えて

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); 

はまた、何のNULLかどうかのチェックはありません:それは、コード混乱に非常にを導くことができる

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

を、列挙値が暗黙的に静的であることを考えますなぜ違いがあるのか​​を知ることができます。

あなたは「それを読むとき、それはほとんど意味がない」ことを認めてきたという事実に心であなたは、これがないC#の:)

+0

ああ、それは今完全な意味がある。最後に答え! :P –

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の内部欠陥であることに同意することを示唆していますJava。 –

+0

完璧な意味合いをしてくれてありがとう、ありがとう:) –

関連する問題