为什么我因“保护级别”错误而“无法访问”?

时间:2011-03-16 13:33:35

标签: c# .net constructor access-modifiers

我收到此错误:

  由于其保护级别,'CTest.A.A()'无法访问。

编译此代码时:

public class A
{
    private A()
    {
    }
}

public class B : A
{
    public void SayHello()
    {
        Console.WriteLine("Hello");
    }
}

任何人都可以解释原因吗?

5 个答案:

答案 0 :(得分:14)

因为A的默认构造函数是private,所以请尝试protected A() {}作为构造函数。

B会自动调用A的默认构造函数,如果B无法访问,或者没有默认构造函数(如果您有构造函数protected A(string s) {}){{} 1}}无法正确实例化。

编译器会在B

中自动生成以下默认构造函数
B

public B() : base() { } 是对base()的默认构造函数的实际调用。

答案 1 :(得分:4)

B上的构造函数(由编译器添加)需要在A上调用默认(no-args)构造函数,但默认构造函数标记为private ,这意味着它只能在A内调用,因此错误。

如果A位于同一个程序集中,请将protected上的构造函数更改为publicinternalB

答案 2 :(得分:2)

A的构造函数是私有的,无法从外部访问。如果要从外部创建A的实例,请将构造函数设置为public或protected。

答案 3 :(得分:1)

private A()更改为public A(),您就可以了。

答案 4 :(得分:0)

这是因为A的构造函数是私有的,但B的构造函数是公共的。当你构造B(也构造A)时,无法访问A的私有构造函数。