一貫性のないアクセシビリティ:パラメータタイプはメソッドよりもアクセスしにくい


227

2つのフォーム間でオブジェクト(基本的に、現在ログオンしているユーザーへの参照)を渡そうとしています。現時点では、ログインフォームに次のような行があります。

private ACTInterface oActInterface;

public void button1_Click(object sender, EventArgs e)
    {
        oActInterface = new ACTInterface(@"\\actserver\Database\Premier.pad",this.textUser.Text,this.textPass.Text);

        if (oActInterface.checkLoggedIn())
        {
            //user has authed against ACT, so we can carry on
            clients oClientForm = new clients(oActInterface);
            this.Hide();
            oClientForm.Show();
        }
        else...

次のフォーム(クライアント)では、次のようになります。

public partial class clients : Form
{
    private ACTInterface oActInt {get; set;}

    public clients(ACTInterface _oActInt)

...これは私が得る結果になります:

Error   1   Inconsistent accessibility: 
parameter type 'support.ACTInterface' is less accessible than method    
'support.clients.clients(support.ACTInterface)'  
c:\work\net\backup\support\support\clients.cs   20  16  support

私は問題が何であるか本当に理解していません-両方のフィールドはプライベートであり、フォームから関連するパブリックメソッドによってアクセスされます。グーグルは、1つの要素がパブリックであり、他の要素がプライベートであることを示しているだけなので、実際には役に立ちませんが、ここではそうではありません。

誰か助けて?

回答:


353

コンストラクタpublicクラスがclientsあるpublicが、それは型のパラメータがあるACTInterfaceprivate(それはクラスにネストされているが?)。それはできません。ACTInterface少なくともと同じくらいアクセスしやすくする必要がありますclients


2
詳細については、エラーCS0051
Alexei Levenkov

5
これは私を助けました。私は次のことを試みていました:JsonConvert.DeserializeObject <List <Name_Of_My_Model >>(response.Content.ReadAsStringAsync()。Result); "Name_Of_My_Model"クラスは、PublicにもPrivateにも設定されていません。「Name_Of_My_Model」(クラス)をpublicに設定して、私が行っていたajax呼び出しのためにWebMethodデコレーターがその上にある「public」メソッドで使用する必要があることがわかりました。
Eric Milliot-Martinez 2016


1
そして@ EricMilliot-Martinez、あなたのコメントは私を助けました。クラスの1つにもPublicを追加する必要がありました。ありがとう。
フューテミア2018

81

クラスを公開します。

class NewClass
{

}

と同じです:

internal class NewClass
{

}

だからクラスは公開する必要があります


27

タイプACTInterfaceがのように聞こえないがpublicinternal(トップレベルのprivate場合)または(別のタイプにネストされている場合)のデフォルトのアクセシビリティを使用している場合。

タイプにpublic修飾子を与えると修正されます。

別のアプローチはinternal、それがあなたの意図である場合、タイプとメソッドの両方を作ることです。

問題は、フィールドoActInterface)のアクセシビリティではなく、タイプACTInterface自体のアクセシビリティです。


9

タイプのアクセシビリティとは何ですかsupport.ACTInterface。エラーは、それが公開されていないことを示唆しています。

シグネチャの一部のパラメータタイプがパブリックではない場合、パブリックメソッドシグネチャを公開することはできません。呼び出し側が必要なパラメータを作成できなかったため、外部からメソッドを呼び出すことはできません。

あなたが作る場合はsupport.ACTInterface、このエラーが削除され、公開を。あるいは、可能であればフォームメソッドのアクセシビリティを減らします。


4

問題は変数にあるのではなく、ACTInterfaceの宣言にあるようです。ACTInterfaceは万が一内部として宣言されていますか?


2

このエラーを受け取ったとき、私は「ヘルパー」クラスを使用していたクラスの内部でこの問題を引き起こした、パブリックとして宣言していない「ヘルパー」クラスがありました。「ヘルパー」クラスをパブリックにすることで、このエラーは次のように解決されました。

public ServiceClass {public ServiceClass(HelperClass _helper){}}

public class HelperClass {} //問題を解決したpublic HelperClassに注意してください。

これは、これに遭遇した誰かを助けるかもしれません。


2
parameter type 'support.ACTInterface' is less accessible than method    
'support.clients.clients(support.ACTInterface)' 

このエラーは、「support.ACTInterface」にアクセスしにくいことを示しています。これは、インターフェイスをプライベートにしたため、少なくとも内部にするか、パブリックにしたためです。



0

新しい形式でクラス変数を使用するときにこのエラーが発生する場合は、クラス定義を

Formname.Designer.cs

Formname.csファイルの代わりに。


0

エンティティフレームワークモデルを更新した後、このエラーが私のソリューションのいくつかのファイルに感染しているのを発見しました。.edmxファイルとTTファイルを右クリックし、[カスタムツールの実行]をクリックするだけで、Visual Studio 2012を再起動した後、再び表示されました。


-3

次のようにコンストラクタをプライベートにしてみてください:

private Foo newClass = new Foo();

あんまり。これはネストされた保護によるものです。
ForcedFakeLaugh
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.