การเข้าถึงที่ไม่สอดคล้องกัน: ประเภทพารามิเตอร์เข้าถึงได้น้อยกว่าวิธี


227

ฉันพยายามที่จะส่งวัตถุ (อ้างอิงถึงผู้ใช้ที่เข้าสู่ระบบในปัจจุบันโดยทั่วไป) ระหว่างสองรูปแบบ ในขณะนี้ฉันมีบางอย่างตามบรรทัดเหล่านี้ในแบบฟอร์มการเข้าสู่ระบบ:

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

ฉันไม่เข้าใจจริงๆว่าปัญหาคืออะไร - ทั้งสองฟิลด์เป็นส่วนตัวและเข้าถึงได้โดยวิธีสาธารณะที่เกี่ยวข้องจากแบบฟอร์ม Googling ไม่ได้ช่วยอะไรมากเพราะมันชี้ไปที่องค์ประกอบหนึ่งว่าเป็นสาธารณะและอีกส่วนหนึ่งซึ่งไม่ใช่ในกรณีนี้

ใครช่วยได้บ้าง

คำตอบ:


352

คอนสตรัคเตอร์ของpublicคลาสclientsคือpublicแต่มันมีพารามิเตอร์ชนิดACTInterfaceที่private(มันซ้อนในคลาส?) คุณทำอย่างนั้นไม่ได้ คุณจะต้องทำอย่างน้อยสามารถเข้าถึงได้เป็นACTInterfaceclients


2
สำหรับข้อมูลเพิ่มเติมตรวจสอบบทความ MSDN เกี่ยวกับข้อผิดพลาดCS0051
Alexei Levenkov

5
สิ่งนี้ช่วยฉัน ฉันกำลังพยายามทำสิ่งต่อไปนี้: JsonConvert.DeserializeObject <List <Name_Of_My_Model>> (response.Content.RentAsStringAsync () ผลการตอบกลับ) คลาส "Name_Of_My_Model" ไม่ได้ถูกตั้งค่าเป็นสาธารณะหรือส่วนตัว กลายเป็นว่าฉันจำเป็นต้องตั้งค่า "Name_Of_My_Model" (คลาส) เป็นสาธารณะเพื่อใช้ในวิธี "สาธารณะ" ที่มีมัณฑนากร WebMethod ด้านบนสำหรับการโทร ajax ที่ฉันทำ
Eric Milliot-Martinez


1
และ @ EricMilliot-Martinez ความคิดเห็นของคุณช่วยฉันได้ ฉันต้องการเพิ่มสาธารณะในชั้นเรียนของฉันด้วย ขอบคุณ
Fütemire

81

ทำให้ชั้นเรียนสาธารณะ

class NewClass
{

}

เหมือนกับ:

internal class NewClass
{

}

ดังนั้นชั้นเรียนต้องเป็นสาธารณะ


27

หากเสียงเหมือนประเภทACTInterfaceไม่ได้เป็นpublicแต่ใช้การเข้าถึงเริ่มต้นของทั้งinternal(ถ้ามันเป็นระดับบนสุด) หรือprivate(ถ้ามันซ้อนกันในประเภทอื่น)

การให้ประเภทที่publicแก้ไขจะแก้ไข

อีกวิธีคือการทำให้ทั้งสองประเภทและวิธีการinternalถ้าเป็นความตั้งใจของคุณ

ปัญหาไม่ใช่ความสามารถในการเข้าถึงของฟิลด์ ( oActInterface) แต่เป็นประเภทของACTInterfaceตัวเอง


9

การเข้าถึงของประเภทsupport.ACTInterfaceคืออะไร ข้อผิดพลาดแสดงว่าไม่เป็นสาธารณะ

คุณไม่สามารถเปิดเผยลายเซ็นเมธอดพับลิกที่พารามิเตอร์บางประเภทของลายเซ็นไม่เป็นพับลิก เป็นไปไม่ได้ที่จะเรียกใช้เมธอดจากภายนอกเนื่องจากผู้เรียกไม่สามารถสร้างพารามิเตอร์ที่ต้องการ

หากคุณเป็นsupport.ACTInterfaceสาธารณะที่จะลบข้อผิดพลาดนี้ หรือลดความสามารถในการเข้าถึงของวิธีการแบบฟอร์มถ้าเป็นไปได้


4

ดูเหมือนว่าปัญหาจะไม่เกิดขึ้นกับตัวแปร แต่เป็นการประกาศของ ACTInterface ACTInterface ประกาศว่าเป็นโอกาสภายในหรือไม่


2

เมื่อฉันได้รับข้อผิดพลาดนี้ฉันมีคลาส "ผู้ช่วยเหลือ" ที่ฉันไม่ได้ประกาศว่าเป็นสาธารณะที่ทำให้เกิดปัญหานี้ภายในชั้นเรียนที่ใช้คลาส "ผู้ช่วยเหลือ" การทำให้คลาส "helper" เป็นแบบสาธารณะแก้ไขข้อผิดพลาดนี้เช่นเดียวกับใน:

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

คลาสสาธารณะ HelperClass {} // โปรดสังเกต HelperClass สาธารณะที่แก้ไขปัญหาของฉัน

นี่อาจช่วยคนอื่นที่เจอสิ่งนี้


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

ข้อผิดพลาดแจ้งว่า 'support.ACTInterface' เข้าถึงได้น้อยเพราะคุณได้สร้างอินเทอร์เฟซส่วนตัวอย่างน้อยทำให้ภายในหรือทำให้เป็นสาธารณะ


1

คุณสามารถรับพารามิเตอร์ (คลาสที่มีการเข้าถึงน้อยลง) objectจากนั้นแปลงเป็นคลาสของคุณด้วยasคำหลัก


คุณไม่คิดเหรอ คุณสามารถเพิ่มสิ่งนี้เป็นความคิดเห็นได้
surajs1n

0

หากข้อผิดพลาดนี้เกิดขึ้นเมื่อคุณต้องการใช้ classvariable ในรูปแบบใหม่คุณควรกำหนด class class ใน

Formname.Designer.cs

แทนไฟล์ Formname.cs


0

หลังจากอัปเดตโมเดลเฟรมเวิร์กเอนทิตีของฉันฉันพบข้อผิดพลาดนี้ติดไวรัสหลายไฟล์ในโซลูชันของฉัน ฉันเพียงคลิกขวาที่ไฟล์. edmx ของฉันและไฟล์ TT ของฉันแล้วคลิก "เรียกใช้เครื่องมือกำหนดเอง" และนั่นทำให้ฉันกลับมาทำงานอีกครั้งหลังจากรีสตาร์ท Visual Studio 2012


-3

ลองทำให้คอนสตรัคเตอร์ของคุณเป็นแบบส่วนตัว:

private Foo newClass = new Foo();

ไม่ได้จริงๆ นี่คือเนื่องจากการป้องกันที่ซ้อนกัน
ForcedFakeLaugh
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.