为什么构造函数不接受具有较低可访问性的类的参数?

时间:2013-03-06 19:25:43

标签: c# constructor

这是:

我有两个表单和一个类,我想传递这个类的实例 Form1到Form2通过参数(属于第二种形式的构造函数)。

public partial class Form1 : Form
{
    Class1 cl = new Class1();

    public Form1()
    {
        InitializeComponent();
    }

    private void button1_Click(object sender, EventArgs e)
    {
        Form2 frm_2 = new Form2(cl);
    }
}

因此,我收到了以下错误:

访问性不一致:参数类型“WindowsFormsApplication1.Class1”的方法不如方法“WindowsFormsApplication1.Form2.Form2(WindowsFormsApplication1.Class1)”

public partial class Form2 : Form
{
    public Form2(Class1 c)
    {
        InitializeComponent();
        Class1 c_1 = new Class1();
        c_1 = c;
    }
}

感谢。

4 个答案:

答案 0 :(得分:8)

Class1是程序集的内部类,但是您正在创建一个以Class1为参数的公共类的公共方法。这就像你公开发布一则广告,说“我们正在接受一份工作申请,但如果你已经在这里工作,你只能获得申请表的副本”。它没有任何意义,因此编译器不允许它。

答案 1 :(得分:3)

您已将Class1定义为internal

internal class Class1
{
}

或(相同):

class Class1
{
}

但是你有一个public方法(在这种情况下是一个构造函数),它接受Class1类型的参数。 public表示它可以从任何其他程序集中看到,但internal表示只能从定义它的程序集(程序集)中看到它。所以,你有一个任何人都可以调用的方法,它接受一个只有你能看到的类型的参数。那不行。你有两个选择:

选项1:公开Class1

public class Class1
{ }

如果您不介意可以从任何程序集访问该类。

选项2:使表单的构造函数内部

internal Form2(Class1 c)
{ }

如果您不介意除了您之外的任何其他程序集都不能创建表单。

答案 2 :(得分:1)

Class1需要声明为公共类,即public class Class1() {...},以供其他公共类使用

答案 3 :(得分:0)

您的Class1应该是公共的,因为Form2及其构造函数具有公共范围。如果我们不将Class1设为公共,则访问受限。这就是编译器显示此消息的原因。

public partial class Form2 : Form
{
    public Form2()
    {
        InitializeComponent();
    }

    public Form2(Class1 c)
    {
        InitializeComponent();
        Class1 c_1 = new Class1();
        c_1 = c;
    }
}

public class Class1
{

    // Your code for Class1
}