2010-11-21 7 views
2


次のコードを使用すると、inconsistengアクセシビリティを報告し続けますが、理由はわかりません。これは、プログラムのクラスであることに依存したり、公開されていない:enumsとpublicクラスとの混乱 - なぜ動作しないのですか?

enum Test 
    {A,B} 

    public class Program //when I remove public, it works 
    { 
     public Test a = Test.A; 

     static void Main(string[] args) 
     { 

     } 
    } 

答えて

2

に列挙を設定する必要が

+0

しかし、私はなぜプログラムクラスのアクセス修飾子が重要であるのか分かりません。 – Loj

+0

ああ、それは私が思った。なぜなら、異なるアセンブリがパブリックプログラムクラスにアクセスし、そのパブリックフィールドで列挙型を公開しているからです。列挙型自体はプライベート(内部も)です。 – Loj

+0

@Mojmi:はい、そうです。クラスのフィールドのアクセシビリティは、クラスのアクセシビリティによってオーバーライドされます。例えば。クラスが 'internal'で' public'フィールドを持っている場合、そのクラスはそのクラスへのアクセスを制限するため、このフィールドは公にアクセスできません。 – adrianbanks

4

あなたが列挙型の宣言にアクセス修飾子を入れていない、とあなたはあなたのProgramクラスのpublicフィールドとして公開されています。アクセス修飾子を宣言しない場合は、privateです。

public enum Test { A, B } 
+0

ありがとう..btwプロパティ?プログラムクラスの分野だと思う。しかし、クラスがプライベートであるとき、なぜそれが機能するのですか? – Loj

+0

良い点、そのフィールド。クラスが 'private'のときはenumと同じアクセシビリティレベルを持ちますので' public'フィールドはそれが含まれているクラスのアクセス修飾子によって制限されています。 –

+1

'private'ではなく' internal'です。彼らが別のタイプのメンバーでない限り。 – configurator

2

列挙型はプライベートであるため、プロパティをpublicにすることはできません。誰かがあなたのプログラムを使用し、コンパイラがあなたにそれについて話してくれれば、公共の財産は外部から公開されます。あなたはおそらく、あなたが明示的に列挙型にアクセス修飾子(すなわち。publicprotectedinternal)を宣言していないので、それはクラスのためinternalである(デフォルト値をとる公共

+0

私は分かりません。クラスがプライベートクラスであれば動作します。クラス宣言に「public」を追加すると、それは機能しません。そしてなぜあなたはそれを財産と呼んでいるのですか?それはフィールドではないですか? – Loj

+0

混乱については申し訳ありませんが、それはもちろん分野です。フィールド/プロパティは公開列挙型、構造体、クラスのみを公開(公開)できるため、enumをpublicとして宣言する必要があります。 – mhenrixon

1

列挙型)。その列挙型はProgramクラスのpublicフィールドで公開されていますが、その列挙型はアセンブリの外側には表示されないため許可されていません。

列挙型をpublicと宣言するか、フィールドのアクセス修飾子をinternalまたはprivateに変更する必要があります。

ProgramクラスをProgramクラスを内部(enumと同じ)に変更するため、を削除すると動作します。どちらも公に公開されていないので、これは問題ありません。

関連する問題