web-dev-qa-db-ja.com

一貫性のないアクセシビリティ:戻り型はメソッドC#よりもアクセスしにくい

はい、これは本当に奇妙です。プライベートメンバーがいて、それをForm2で使用したい。静的なパブリックメソッドを作成したので、そのメンバーをForm2に入れることができます。

これが私のコードです:

private static AppController appController;
private BreadRepository breadRep;
private CakeRepository cakeRep;
private SandwichRepository sandwichRep;

public Form1()
{
    InitializeComponent();

    breadRep = new BreadRepository();
    cakeRep = new CakeRepository();
    sandwichRep = new SandwichRepository();
    appController = new AppController(breadRep , sandwichRep, cakeRep);
}
public static AppController getController()
{
    return appController;
}

Form1からappControllerをパブリックにしようとしましたが、さらに多くのエラーが発生します。今私はこれを手に入れます:

一貫性のないアクセシビリティ:戻り型 'exemplu_map.controller.AppController'はメソッド 'exemplu_map.Form1.getController()'よりもアクセスしにくい

更新:

これが私のAppControllerクラスです:

class AppController
{
    private BreadRepository breadRep;
    private SandwichRepository sandwichRep;
    private CakeRepository cakeRep;
    public AppController(BreadRepository breadRep, SandwichRepository sandwichRep, CakeRepository cakeRep)
    {
        this.breadRep = breadRep;
        this.sandwichRep = sandwichRep;
        this.cakeRep = cakeRep;
    }

    public void writeToFile(String file)
    {
        StreamWriter wr = new StreamWriter(file);
        String writeMe = "";
        foreach(Bread e in breadRep.getAll())
        {
            writeMe = writeMe + e.getAll() + "\n";
        }
        foreach (Sandwich e in sandwichRep.getAll())
        {
            writeMe = writeMe + e.getAll() + "\n";
        }
        foreach (Cake e in cakeRep.getAll())
        {
            writeMe = writeMe + e.getAll() + "\n";
        }

        wr.Write(writeMe);
        wr.Close();
    }
}

AppControllerをpublicに変更しましたが、再びエラーが発生します。同じエラーですが、breadRep、cakeRep、sandwichRepの場合です。

11
icebox19

問題は、@ Selman22で説明したように、戻り値がpublicであるのに、メソッドがinternalであるということです。 (クラスはデフォルトでinternalです。)

両方がpublicまたはinternalであれば、すべてが機能するはずです。

クラスpublicを作成することは、他のクラスへの依存関係のために難しいようです。さらに、デフォルトでは物事にアクセスしづらくしておく方が良いので、それは最善ではないかもしれません。

メソッドをinternalにすると、同じ問題が別の端から解決されます。

とにかく、@ Selman22が最初でした:)。私はちょうど私の2セントを追加したので、おそらく彼の答えを受け入れる必要があります:)。

37
AlexD

アクセシビリティは、タイプまたはメンバーに与えられたアクセスレベルによって決定されます。タイプ/タイプメンバーごとにデフォルトのアクセスレベルが異なることに注意することが重要です

タイプのデフォルトのアクセスレベルは内部です。

メンバーのデフォルトのアクセスレベルはprivateです。

privateは型に適用できないことにも注意してください(型がプライベートの場合、型を構築するにはどうすればよいですか? 、タイプが別のタイプにネストされていない限り

これを知っていると、型を公開するときにエラーが発生する理由が簡単にわかります。タイプをパブリックにすると、他のアセンブリによって参照されるようにアセンブリが開かれます。つまり、アセンブリが内部のタイプを参照できます。

型がパブリックとして宣言されていて、それらにパブリックコンストラクターがある場合、パブリックコンストラクターは外部アセンブリから呼び出すことができると想定されています。このため、アセンブリ内の型のコンストラクタまたはその他のパブリックメンバーを構成するすべての型には、パブリックアクセスが必要です。

public class SomeClass
{
    // This class and this constructor are externally visible
    // The parameter of type SomeOtherClass must also be public in order
    // for external assemblies to be able to construct this type
    public SomeClass(SomeOtherClass someOtherClass) { }
}

// This would cause the issue you are having since this type is private but
// is included within a public contract (above), therefore the accessibility is 'inconsistent'
private class SomeOtherClass { }

余談ですが、あなたの問題はメンバーのアクセシビリティに関するものです

静的メンバーAppControllerはプライベートとマークされており、Form1クラスのみが参照できることを意味します(私はそれが常駐するクラスであると想定しています)

解決策(Alex Dが示す)は、メンバーをprivateではなくinternalにすることです。これは、メンバーが同じアセンブリ内のどのタイプからも見えることを意味します。 privateは、メンバーを宣言する型にのみ表示されます

これをtooアクセス可能(public)にすると、上記のようなエラーが発生します。 internalはアセンブリ内の内部動作を維持します。つまり、これらのアクセシビリティの問題は発生しません。

6
Charleh