Непоследовательная доступность: тип параметра менее доступен, чем метод


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

Я не очень понимаю, в чем проблема - оба поля являются закрытыми, и доступ к ним осуществляется соответствующим открытым методом из формы. Поиск в Google не очень помогает, так как он указывает на то, что один элемент является общедоступным, а другой - частным, что здесь не так.

Кто-нибудь поможет?

Ответы:


353

Конструктор publicкласса clientsявляется , publicно он имеет параметр типа , ACTInterfaceкоторый private(она вложена в классе?). Вы не можете сделать это. Вы должны сделать ACTInterfaceпо крайней мере так же доступно, как clients.


2
Для получения дополнительной информации проверьте статью MSDN об ошибке CS0051
Алексей Левенков

5
Это помогло мне. Я пытался сделать следующее: JsonConvert.DeserializeObject <List <Name_Of_My_Model >> (response.Content.ReadAsStringAsync (). Result); Класс «Name_Of_My_Model» не был установлен ни в Public, ни в Private. Оказалось, что мне НУЖНО установить "Name_Of_My_Model" (класс) в public, чтобы использовать его в "публичном" методе, в котором над декоратором WebMethod был указан вызов ajax, который я делал.
Эрик Миллиот-Мартинес


1
И @ EricMilliot-Martinez, ваш комментарий помог мне. Мне нужно было добавить Public в один из моих классов. Спасибо.
Fütemire

81

Сделайте класс публичным.

class NewClass
{

}

такой же как:

internal class NewClass
{

}

поэтому класс должен быть публичным


27

Если звучит так, как будто типа ACTInterfaceнет public, но использует доступность по умолчанию либо internal(если это верхний уровень), либо private(если он вложен в другой тип).

Предоставление типа publicмодификатор исправит это.

Другой подход заключается в создании типа и метода internal, если это ваше намерение.

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


9

Что такое доступность типа support.ACTInterface. Ошибка предполагает, что это не публично.

Вы не можете предоставить публичную подпись метода, где некоторые типы параметров подписи не являются публичными. Невозможно вызвать метод извне, так как вызывающая сторона не может создать требуемые параметры.

Если вы сделаете это support.ACTInterfaceпубличным, это уберет эту ошибку. В качестве альтернативы, если возможно, уменьшите доступность метода формы.


4

Проблема не в переменной, а в объявлении ACTInterface. ACTInterface объявлен как внутренний случайно?


2

Когда я получил эту ошибку, у меня был класс «помощник», который я не объявил как открытый, который вызвал эту проблему внутри класса, который использовал класс «помощник». Публичный класс helper решил эту ошибку, как в:

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

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