Tutarsız Erişilebilirlik: Parametre türüne yöntemden daha az erişilebilir


227

İki form arasında bir nesne (şu anda oturum açmış kullanıcı, temelde bir referans) geçmek çalışıyorum. Şu anda, giriş satırında şu satırlarda bir şey var:

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

sonraki formda (müşteriler), ben var:

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

    public clients(ACTInterface _oActInt)

... bu da elde etmeme neden oluyor:

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

Sorunun ne olduğunu gerçekten anlamıyorum - her iki alan da özeldir ve formdan ilgili genel yöntemle erişilir. Google çalışanı gerçekten yardımcı olmuyor, çünkü sadece bir öğenin herkese açık ve diğerinin özel olduğunu gösteriyor, burada durum böyle değil.

Kimse yardım eder mi?

Yanıtlar:


353

Yapıcısı publicsınıfında clientsolduğunu publicancak tür bir parametresi vardır ACTInterfaceedilir private(bir sınıfta yuvalanır?). Bunu yapamazsın. ACTInterfaceEn azından mümkün olduğunca erişilebilir olmanız gerekir clients.


2
Daha fazla bilgi için hata MSDN makalesini kontrol CS0051
Alexei Levenkov

5
Bu bana yardımcı oldu. Aşağıdakileri yapmaya çalışıyordum: JsonConvert.DeserializeObject <Liste <Ad_Of_My_Model>> (response.Content.ReadAsStringAsync (). Sonuç); "Name_Of_My_Model" sınıfı Genel veya Özel olarak ayarlanmadı. Yaptığım ajax çağrısı için üzerinde bir WebMethod dekoratörü olan bir "genel" yöntemde kullanılacak "Name_Of_My_Model" (sınıf) genel ayarlamak için GEREKİR çıktı.
Eric Milliot-Martinez


1
Ve @ EricMilliot-Martinez, yorumunuz bana yardımcı oldu. Sınıflarımdan birine de Public eklemem gerekiyordu. Teşekkürler.
Fütemire

81

Sınıfı herkese açık yapın.

class NewClass
{

}

aynıdır:

internal class NewClass
{

}

bu yüzden sınıf halka açık olmalı


27

Tip gibi sesler Eğer ACTInterfacedeğil public, ama her iki varsayılan erişilebilirliğini kullanıyor internal(üst düzey ise) veya private(başka tip iç içe ise).

publicDeğiştiricinin türünün verilmesi sorunu düzeltir.

Başka bir yaklaşım, internalniyetiniz ise hem türü hem de yöntemi yapmaktır .

Sorun, alanın ( oActInterface) erişilebilirliği değil, türün ACTInterfacekendisinin erişilebilirliğidir .


9

Türün erişilebilirliği nedir support.ACTInterface. Hata, herkese açık olmadığını gösterir.

İmzanın bazı parametre türlerinin herkese açık olmadığı bir genel yöntem imzasını gösteremezsiniz. Arayan gerekli parametreleri oluşturamadığından yöntemi dışarıdan çağırmak mümkün olmazdı.

support.ACTInterfaceHerkese açık yaparsanız, bu hata kaldırılır. Alternatif olarak, mümkünse form yönteminin erişilebilirliğini azaltın.


4

Sorun değişken ile değil, ACTInterface bildirimi ile ilgili gibi görünüyor. ACTInterface şans eseri dahili olarak mı ilan edildi?


2

Bu hatayı aldığımda, "yardımcı" sınıfı kullanan sınıfın içinde bu soruna neden olan genel olarak bildirmediğim bir "yardımcı" sınıfım vardı. "Yardımcı" sınıfını herkese açık hale getirmek şu hatayı çözdü:

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

public class HelperClass {} // Sorunumu çözen genel HelperClass'a dikkat edin.

Bu, bununla karşılaşan başka birine yardımcı olabilir.


2
parameter type 'support.ACTInterface' is less accessible than method    
'support.clients.clients(support.ACTInterface)' 

Hata, 'support.ACTInterface' öğesine daha az erişilebilir olduğundan, arayüzü özel olarak yaptığınız, en azından dahili hale getirdiğiniz veya herkese açık hale getirdiğiniz için.


1

Parametre'yi (daha az erişilebilirliğe sahip objectsınıf) alabilir ve asanahtar kelimeyle sınıfınıza dönüştürebilirsiniz .


Düşünmüyor musun? bunu yorum olarak ekleyebilirdiniz.
surajs1n

0

Sınıflandırmayı yeni bir biçimde kullanmak istediğinizde bu hata oluşursa, sınıf tanımını

Formname.Designer.cs

Formname.cs dosyası yerine.


0

Varlık çerçeve modelimi güncelledikten sonra, bu hatayı çözümümde birkaç dosyaya bulaştırarak buldum. Sadece .edmx dosyamı ve TT dosyamı sağ tıklayıp "Özel Aracı Çalıştır" ı tıkladım ve bu da Visual Studio 2012'nin yeniden başlatılmasından hemen sonra beni tekrar etti.


-3

Oluşturucunuzu şu şekilde özel yapmayı deneyin:

private Foo newClass = new Foo();

Pek sayılmaz. Bunun nedeni iç içe korumadır.
1919'da
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.