2011-09-19 11 views
14

今日、私はこのようなコードに遭遇しました。クラスボディの外側ではあるが名前空間の内側にあるenumの定義

namespace Foo 
{ 

    public enum Game{ High, Low}; 
    public enum Switch{On, Off}; 

    public class Bar() 
    { 
    // Blah 
    } 
} 

私はそのことと、クラス内の列挙型宣言との違いは分かりませんでした。 AFAIK、あなたはまだクラス内の列挙型を "オーバーライド"することができます。

答えて

21

列挙型は、クラスと同じように型です。クラスの中で列挙型を宣言すると、それは単なる入れ子型です。ネストされた列挙型だけがを隠す他の列挙型は同じ名前で外側のスコープで宣言されていますが、完全修飾名(例では名前空間接頭辞を使用して)で隠し列挙型を参照できます。

トップレベルの列挙型またはネストされた列挙型を宣言するかどうかは、デザインとその列挙型がクラス以外のものによって使用されるかどうかによって決まります。また、ネストされた列挙型を非公開にすることも、囲む型に保護することもできます。しかし、トップレベルのenumははるかに一般的です。

+0

したがって、適切な名前はトップレベルの列挙型ですか? – surfasb

+0

私はそう思います...これらの定義は[ここ](http://msdn.microsoft.com/en-us/library/ba0a1yw2.aspx)で見つけることができます。 –

4

あなたはクラスで列挙を入れた場合は、クラス名を使用すると、たとえば、クラスの外でそれを使用するたびに指定する必要があります:

SomeLongClassName x = new SomeLongClassName(SomeLongClassName.Game.High, SomeLongClassName.Switch.On); 

の代わり:

SomeLongClassName x = new SomeLongClassName(Game.High, Switch.On); 

クラスの中でennumerationを使用することができますが、そのような種類の分離はクラスに対してのみ機能します。単一のメソッドでのみ使用される列挙型がある場合は、そのメソッドの中に入れることはできません。

関連する問題