Подтвердить что ты не робот

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

Хорошо, так что это действительно странно. У меня есть частный член, и я хочу использовать его в Form2. Я создал публичный статический метод, так что я могу получить этот член в Form2.

Вот мой код:

private static AppController appController;
private BreadRepository breadRep;
private CakeRepository cakeRep;
private SandwichRepository sandwichRep;

public Form1()
{
    InitializeComponent();

    breadRep = new BreadRepository();
    cakeRep = new CakeRepository();
    sandwichRep = new SandwichRepository();
    appController = new AppController(breadRep , sandwichRep, cakeRep);
}
public static AppController getController()
{
    return appController;
}

Я попытался сделать appController из Form1 общедоступным, но я получаю еще больше ошибок. Сейчас я получаю следующее:

Непоследовательная доступность: тип возвращаемого значения "instanceplu_map.controller.AppController" менее доступен, чем метод "exampleplu_map.Form1.getController()" Любые идеи?

Update:

Вот мой класс AppController:

class AppController
{
    private BreadRepository breadRep;
    private SandwichRepository sandwichRep;
    private CakeRepository cakeRep;
    public AppController(BreadRepository breadRep, SandwichRepository sandwichRep, CakeRepository cakeRep)
    {
        this.breadRep = breadRep;
        this.sandwichRep = sandwichRep;
        this.cakeRep = cakeRep;
    }

    public void writeToFile(String file)
    {
        StreamWriter wr = new StreamWriter(file);
        String writeMe = "";
        foreach(Bread e in breadRep.getAll())
        {
            writeMe = writeMe + e.getAll() + "\n";
        }
        foreach (Sandwich e in sandwichRep.getAll())
        {
            writeMe = writeMe + e.getAll() + "\n";
        }
        foreach (Cake e in cakeRep.getAll())
        {
            writeMe = writeMe + e.getAll() + "\n";
        }

        wr.Write(writeMe);
        wr.Close();
    }
}

Я изменил AppController для публики, но я снова получаю больше ошибок. Такая же ошибка, но для breadRep, cakeRep, sandwichRep.

4b9b3361

Ответ 1

Проблема заключается в том, что, как пояснил @Selman22, ваш метод public, а его возвращаемое значение internal. (Классы internal по умолчанию.)

Если оба значения public или internal, все должно работать.

Создание класса public оказалось затруднительным из-за зависимостей от других классов. Более того, это может быть не самое лучшее, поскольку по умолчанию лучше держать вещи менее доступными.

Создание метода internal решает ту же проблему с другого конца.

В любом случае, @Selman22 был первым:). Я просто добавил свои два цента, поэтому вы, возможно, согласитесь с его ответом:).

Ответ 2

Доступность определяется уровнем доступа, заданным типу или члену. Важно отметить, что уровень доступа по умолчанию отличается для типов/типов элементов

Уровень доступа по умолчанию для типов внутренний

Уровень доступа по умолчанию для членов частный

Также важно отметить, что private не применим к типам (как вы можете построить тип, если он является приватным - он может только когда-либо конструироваться), если тип не вложен в другой тип

Зная это, легко понять, почему вы получаете ошибки при создании ваших типов. При создании типа public вы открываете свою сборку, на которую ссылаются другие сборки, то есть они могут видеть типы внутри.

Если ваши типы объявлены общедоступными и у них есть открытый конструктор, тогда ожидается, что их публичный конструктор может быть вызван внешней сборкой. Из-за этого все типы, составляющие конструктор или любые другие публичные элементы типа в вашей сборке, должны иметь общедоступную доступность.

public class SomeClass
{
    // This class and this constructor are externally visible
    // The parameter of type SomeOtherClass must also be public in order
    // for external assemblies to be able to construct this type
    public SomeClass(SomeOtherClass someOtherClass) { }
}

// This would cause the issue you are having since this type is private but
// is included within a public contract (above), therefore the accessibility is 'inconsistent'
private class SomeOtherClass { }

Я отвлекся - ваша проблема, с доступностью участника

Ваш статический член AppController отмечен личным значением, его можно увидеть только классом Form1 (я предполагаю, что класс, в котором он находится)

Решение (как показано Alex D) может состоять в том, чтобы сделать элемент внутренним вместо private. Это означает, что элемент может быть замечен любыми типами в одной и той же сборке. закрытый доступен только для типа, объявляющего член

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