Aksesibilitas yang Tidak Konsisten: Jenis parameter kurang dapat diakses daripada metode

227

Saya mencoba untuk melewatkan objek (referensi ke pengguna yang saat ini masuk, pada dasarnya) antara dua bentuk. Saat ini, saya memiliki sesuatu di sepanjang baris ini dalam formulir login:

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...

pada formulir berikutnya (klien), saya punya:

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

    public clients(ACTInterface _oActInt)

... yang menghasilkan saya mendapatkan:

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

Saya tidak benar-benar mengerti apa masalahnya - kedua bidang bersifat pribadi, dan diakses dengan metode publik yang relevan dari formulir. Googling tidak terlalu membantu, karena hanya menunjuk ke satu elemen yang bersifat publik dan yang lain pribadi, yang tidak terjadi di sini.

Adakah yang bisa membantu?

dodgrile
sumber

Jawaban:

353

Konstruktor publickelas clientsadalah publictetapi memiliki parameter tipe ACTInterfaceyang private(bersarang di kelas?). Kamu tidak bisa melakukan itu Anda harus membuat ACTInterfacesetidaknya dapat diakses clients.

jason
sumber
2
Untuk informasi lebih lanjut, periksa artikel MSDN tentang kesalahan CS0051
Alexei Levenkov
5
Ini membantu saya. Saya mencoba melakukan hal berikut: JsonConvert.DeserializeObject <Daftar <Name_Of_My_Model>> (response.Content.RontAs.ReadAsStringAsync (). Hasil); Kelas "Name_Of_My_Model" tidak disetel untuk Publik atau Privat. Ternyata saya PERLU untuk mengatur "Name_Of_My_Model" (kelas) ke publik untuk digunakan dalam metode "publik" yang memiliki dekorator WebMethod di atasnya untuk panggilan ajax yang saya lakukan.
Eric Milliot-Martinez
Bahkan lebih banyak informasi Pembatasan Penggunaan Tingkat Aksesibilitas (C #)
Alexei Levenkov
1
Dan @ EricMilliot-Martinez, komentar Anda membantu saya. Saya perlu menambahkan Publik ke salah satu kelas saya juga. Terima kasih.
Fütemire
81

Jadikan kelas publik.

class NewClass
{

}

sama dengan:

internal class NewClass
{

}

jadi kelas harus bersifat publik

Nisha
sumber
27

Jika kedengarannya jenisnya ACTInterfacebukan public, tetapi menggunakan aksesibilitas default baik internal(jika tingkat atas) atau private(jika bersarang di tipe lain).

Memberi tipe publicpengubah akan memperbaikinya.

Pendekatan lain adalah membuat jenis dan metode internal, jika itu maksud Anda.

Masalahnya bukan aksesibilitas bidang ( oActInterface), melainkan tipe ACTInterfaceitu sendiri.

Marc Gravell
sumber
9

Apa aksesibilitas tipe tersebut support.ACTInterface. Kesalahan menunjukkan itu bukan untuk umum.

Anda tidak dapat mengekspos tanda tangan metode publik di mana beberapa tipe parameter tanda tangan tidak publik. Tidak mungkin memanggil metode dari luar karena penelepon tidak dapat membuat parameter yang diperlukan.

Jika Anda membuat support.ACTInterfacepublik yang akan menghapus kesalahan ini. Atau kurangi aksesibilitas metode formulir jika memungkinkan.

James Gaunt
sumber
4

Masalahnya tampaknya tidak dengan variabel melainkan dengan deklarasi ACTInterface. Apakah ACTInterface dinyatakan sebagai masalah internal?

Craig W.
sumber
2

Ketika saya menerima kesalahan ini, saya memiliki kelas "pembantu" yang saya tidak nyatakan sebagai publik yang menyebabkan masalah ini di dalam kelas yang menggunakan kelas "pembantu". Membuat kelas "helper" publik memecahkan kesalahan ini, seperti pada:

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

HelperClass kelas publik {} // Catat HelperClass publik yang memecahkan masalah saya.

Ini dapat membantu orang lain yang mengalami ini.

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

Kesalahan mengatakan 'support.ACTInterface' kurang dapat diakses karena Anda telah menjadikan antarmuka sebagai pribadi, setidaknya menjadikannya internal atau menjadikannya publik.

Harrish
sumber
1

Anda bisa mendapatkan Parameter (kelas yang memiliki aksesibilitas lebih rendah) objectsaat mengonversinya ke kelas Anda dengan askata kunci.

Sadeq Shajary
sumber
Bukankah begitu? Anda bisa menambahkan ini sebagai komentar.
surajs1n
0

Jika kesalahan ini terjadi ketika Anda ingin menggunakan classvariable di formulir baru, Anda harus meletakkan definisi kelas di

Formname.Designer.cs

bukannya file Formname.cs.

ltsstar
sumber
0

Setelah memperbarui model kerangka entitas saya, saya menemukan kesalahan ini menginfeksi beberapa file dalam solusi saya. Saya cukup klik kanan pada file .edmx dan file TT saya dan klik "Run Custom Tool" dan itu membuat saya benar lagi setelah restart Visual Studio 2012.

Simon Kiely
sumber
-3

Coba jadikan konstruktor Anda pribadi seperti ini:

private Foo newClass = new Foo();
Yousri Mousa
sumber
Tidak juga. Ini karena perlindungan bersarang.
ForcedFakeLaugh