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?

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.


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,


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


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 .


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.


4

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


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.


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.


1

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


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.


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.


Korzystając z naszej strony potwierdzasz, że przeczytałeś(-aś) i rozumiesz nasze zasady używania plików cookie i zasady ochrony prywatności.
Licensed under cc by-sa 3.0 with attribution required.