Непоследовательная доступность: тип параметра менее доступен, чем метод - PullRequest
190 голосов
/ 03 июня 2011

Я пытаюсь передать объект (в основном ссылку на пользователя, вошедшего в систему) между двумя формами. На данный момент у меня есть что-то вроде этого в форме входа в систему:

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 не очень помогает, так как он указывает на то, что один элемент является общедоступным, а другой - частным, что здесь не так.

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

Ответы [ 10 ]

291 голосов
/ 03 июня 2011

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

62 голосов
/ 26 марта 2012

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

class NewClass
{

}

совпадает с:

internal class NewClass
{

}

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

26 голосов
/ 03 июня 2011

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

Если задать тип, то модификатор public это исправит.

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

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

8 голосов
/ 03 июня 2011

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

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

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

4 голосов
/ 03 июня 2011

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

2 голосов
/ 04 апреля 2018

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

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

public class HelperClass {} // Обратите внимание на общедоступный HelperClass, который решил мою проблему.

Это может помочь кому-то еще, кто сталкивается с этим.

0 голосов
/ 10 октября 2018

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

0 голосов
/ 16 декабря 2017

Попробуйте сделать ваш конструктор приватным, как это:

private Foo newClass = new Foo();
0 голосов
/ 25 июля 2013

После обновления модели структуры сущностей я обнаружил, что эта ошибка заразила несколько файлов в моем решении. Я просто щелкнул правой кнопкой мыши по файлу .edmx и моему файлу TT и нажал «Запустить пользовательский инструмент», и после перезапуска Visual Studio 2012 я снова оказался в праве.

0 голосов
/ 28 июня 2013

Если эта ошибка возникает, когда вы хотите использовать переменную класса в новой форме, вы должны поместить определение класса в

Formname.Designer.cs

вместо файла Formname.cs.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...