Niespójna dostępność: typ parametru jest mniej dostępny niż metoda

227

Próbuję przekazać obiekt (w zasadzie odniesienie do aktualnie zalogowanego użytkownika) między dwiema postaciami. W tej chwili mam coś takiego w formularzu logowania:

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

w następnym formularzu (klienci) mam:

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

    public clients(ACTInterface _oActInt)

... co powoduje, że dostaję:

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

Naprawdę nie rozumiem na czym polega problem - oba pola są prywatne i są dostępne za pomocą odpowiedniej metody publicznej z formularza. Googling tak naprawdę nie pomaga, ponieważ wskazuje tylko, że jeden element jest publiczny, a drugi prywatny, co nie jest tutaj prawdą.

Czy ktoś pomaga?

dodgrile
źródło

Odpowiedzi:

352

Konstruktor publicklasy clientsjest, publicale ma parametr typu, ACTInterfacektóry jest private(jest zagnieżdżony w klasie?). Nie możesz tego zrobić. Musisz uczynić ACTInterfaceprzynajmniej tak dostępnym, jak clients.

Jason
źródło
2
Aby uzyskać więcej informacji, sprawdź artykuł MSDN o błędzie CS0051
Aleksiej Levenkov
5
To mi pomogło. Próbowałem wykonać następujące czynności: JsonConvert.DeserializeObject <List <Name_Of_My_Model>> (response.Content.ReadAsStringAsync (). Wynik); Klasa „Name_Of_My_Model” nie została ustawiona na publiczną ani prywatną. Okazało się, że POTRZEBUJĘ, aby ustawić „Name_Of_My_Model” (klasę) na public do użycia w metodzie „public”, która miała dekorator WebMethod nad nim dla wywołania ajax, które robiłem.
Eric Milliot-Martinez,
Jeszcze więcej informacji Ograniczenia dotyczące korzystania z poziomów dostępności (C #)
Aleksiej Lewenkow
1
I @ EricMilliot-Martinez, twój komentarz mi pomógł. Musiałem także dodać Public do jednej z moich klas. Dzięki.
Fütemire,
81

Upublicznij klasę.

class NewClass
{

}

jest taki sam jak:

internal class NewClass
{

}

więc klasa musi być publiczna

Nisha
źródło
27

Jeśli brzmi jak typ, ACTInterfacenie jest public, ale korzysta z domyślnej dostępności albo internal(jeśli jest na najwyższym poziomie) lub private(jeśli jest zagnieżdżony w innym typie).

Podanie typu publicmodyfikator to naprawi.

Innym podejściem jest wykonanie zarówno typu, jak i metody internal, jeśli taki jest twój zamiar.

Problemem nie jest dostępność pola ( oActInterface), ale ACTInterfacesam typ .

Marc Gravell
źródło
9

Jaka jest dostępność tego typu support.ACTInterface. Błąd sugeruje, że nie jest publiczny.

Nie można ujawnić podpisu metody publicznej, gdy niektóre typy parametrów podpisu nie są publiczne. Nie byłoby możliwe wywołanie metody z zewnątrz, ponieważ program wywołujący nie mógł skonstruować wymaganych parametrów.

Jeśli podasz do support.ACTInterfacepublicznej wiadomości, usunie ten błąd. Alternatywnie, jeśli to możliwe, zmniejsz dostępność metody formularza.

James Gaunt
źródło
4

Problem nie wydaje się dotyczyć zmiennej, ale raczej deklaracji interfejsu ACTI. Czy ACTInterface jest przez przypadek zadeklarowany jako wewnętrzny?

Craig W.
źródło
2

Gdy otrzymałem ten błąd, miałem klasę „pomocnika”, której nie zadeklarowałem jako publiczną, co spowodowało ten problem w klasie, która korzystała z klasy „pomocnika”. Upublicznienie klasy „pomocnika” rozwiązało ten błąd, jak w:

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

HelperClass klasy publicznej {} // Zwróć uwagę na publiczny HelperClass, który rozwiązał mój problem.

Może to pomóc komuś, kto się z tym spotka.

Keenan Stewart
źródło
2
parameter type 'support.ACTInterface' is less accessible than method    
'support.clients.clients(support.ACTInterface)' 

Błąd mówi „support.ACTInterface” jest mniej dostępny, ponieważ ustawiłeś interfejs jako prywatny, przynajmniej uczyń go wewnętrznym lub publicznym.

Harrish
źródło
1

Możesz uzyskać parametr (klasa o mniejszej dostępności), a objectnastępnie przekonwertować go na klasę według assłowa kluczowego.

Sadeq Shajary
źródło
Nie sądzisz? mogłeś dodać to jako komentarz.
surajs1n
0

Jeśli ten błąd występuje, gdy chcesz użyć zmiennej klasy w nowej formie, powinieneś umieścić definicję klasy w

Formname.Designer.cs

zamiast pliku Formname.cs.

ltsstar
źródło
0

Po zaktualizowaniu modelu szkieletu encji znalazłem ten błąd, który zainfekował kilka plików w moim rozwiązaniu. Po prostu kliknąłem prawym przyciskiem myszy plik .edmx i plik TT, a następnie kliknąłem „Uruchom narzędzie niestandardowe”, co znowu mnie przywróciło po ponownym uruchomieniu programu Visual Studio 2012.

Simon Kiely
źródło
-3

Spróbuj ustawić swojego konstruktora jako prywatny:

private Foo newClass = new Foo();
Yousri Mousa
źródło
Nie całkiem. Wynika to z zagnieżdżonej ochrony.
ForcedFakeLaugh