Невідповідна доступність: Тип параметра менш доступний, ніж метод


227

Я намагаюся передати об’єкт (посилання на поточно зареєстрованого користувача, в основному) між двома формами. На даний момент у мене у формі входу є щось таке:

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

Я не дуже розумію, у чому проблема - обидва поля приватні та доступні відповідним публічним методом із форми. Гуглінг насправді не допомагає, оскільки він просто вказує на те, що один елемент є загальнодоступним, а інший приватним, що тут не так.

Хтось допоможе?

Відповіді:


352

Конструктор publicкласу clientsє, publicале у нього є параметр типу, ACTInterfaceякий є private(він вкладений у клас?). Ви не можете цього зробити. Вам потрібно зробити ACTInterfaceпринаймні настільки ж доступними, як clients.


2
Для отримання додаткової інформації перегляньте статтю MSDN про помилку CS0051
Олексій Левенков

5
Це мені допомогло. Я намагався зробити наступне: JsonConvert.DeserializeObject <Список <Ім'я_Of_My_Model>> (response.Content.ReadAsStringAsync (). Результат); Клас "Name_Of_My_Model" не було встановлено ні для публічного, ні для приватного. Виявилося, Я НЕОБХІДНО встановити "Name_Of_My_Model" (клас) для загального користування для використання в "загальнодоступному" методі, який мав над ним декоратор WebMethod для виклику в Ajax, який я робив.
Ерік Мілліот-Мартінес


1
І @ EricMilliot-Martinez, ваш коментар мені допоміг. Мені також потрібно було додати Public до одного з моїх занять. Дякую.
Фютемір

81

Робіть клас загальнодоступним.

class NewClass
{

}

те саме, що:

internal class NewClass
{

}

тому клас повинен бути публічним


27

Якщо звучить як тип ACTInterfaceнемає public, але використовується доступність за замовчуванням або internal(якщо він верхнього рівня), або private(якщо він вкладений в інший тип).

Надаючи тип, publicмодифікатор би це виправив.

Інший підхід полягає в тому, щоб зробити і тип, і метод internal, якщо це ваш задум.

Проблема полягає не в доступності поля ( oActInterface), а в тому, що стосується самого типу ACTInterface.


9

Яка доступність типу support.ACTInterface. Помилка говорить про те, що вона не є загальнодоступною.

Ви не можете відкрити підпис публічного методу, коли деякі типи параметрів підпису не є загальнодоступними. Викликати метод іззовні неможливо, оскільки абонент не міг побудувати необхідні параметри.

Якщо ви support.ACTInterfaceоприлюднили це повідомлення, вилучите цю помилку. Якщо можливо, зменшіть доступність методу форми.


4

Схоже, проблема не в змінній, а в декларуванні ACTInterface. Чи випадково оголошено ACTInterface як внутрішній?


2

Коли я отримав цю помилку, у мене був клас "помічник", який я не оголосив публічним, що спричинило цю проблему всередині класу, який використовував клас "помічник". Здійснення загальнодоступного класу "помічник" вирішило цю помилку, як у:

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

громадський клас HelperClass {} // Зверніть увагу на громадський HelperClass, який вирішив мою проблему.

Це може допомогти іншому, хто стикається з цим.


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

Помилка каже, що "support.ACTInterface" менш доступний, оскільки ви зробили інтерфейс приватним, принаймні зробіть його внутрішнім або зробіть його загальнодоступним.


1

Ви можете отримати Параметр (клас, який має меншу доступність), а objectпотім перетворити його у свій клас за asключовим словом.


Ти не думаєш? Ви могли б додати це як коментар.
surajs1n

0

Якщо ця помилка виникає, коли ви хочете використовувати клас змінної у новій формі, слід поставити визначення класу в

Formname.Designer.cs

замість файлу Formname.cs.


0

Після оновлення моєї структури фреймворку я знайшов цю помилку, заразивши кілька файлів у своєму рішенні. Я просто клацнув правою кнопкою миші на мій файл .edmx і мій файл TT і натиснув «Запустити спеціальний інструмент», і це було в мене знову після перезавантаження Visual Studio 2012.


-3

Спробуйте зробити свій конструктор приватним так:

private Foo newClass = new Foo();

Не зовсім. Це пов’язано з вкладеним захистом.
ForcedFakeLaugh
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.