【问题标题】:Why am I getting an "inaccessible due to protection level" error?为什么我收到“由于保护级别而无法访问”错误?
【发布时间】:2011-07-16 14:41:39
【问题描述】:

我收到此错误:

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

编译这段代码时:

public class A
{
    private A()
    {
    }
}

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

谁能解释一下原因?

【问题讨论】:

    标签: c# .net constructor access-modifiers


    【解决方案1】:

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

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

    编译器自动在B中生成如下默认构造函数

    public B() : base()
    {
    }
    

    其中base() 是对A 的默认构造函数的实际调用。

    【讨论】:

    • 虽然不是全部。即使 B 是一个抽象类,您也会得到相同的编译错误。抽象类没有构造函数,但编译器仍然强制执行规则,因为从 B 派生的类 C 也会有同样的问题。 (请注意,即使没有从 C 派生的类也是如此。)
    【解决方案2】:

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

    A 上的构造函数更改为protectedpublic,如果B 在同一个程序集中,则更改为internal

    【讨论】:

      【解决方案3】:

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

      【讨论】:

        【解决方案4】:

        private A() 更改为 public A() 即可。

        【讨论】:

          【解决方案5】:

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

          【讨论】:

          • B 的构造函数公开有什么关系?
          • 如何使用私有构造函数实例化 B?我只是指出 B 可以被实例化
          • 可以在 B 上使用静态工厂方法,调用 B 的私有构造函数(需要调用 A 的公共或受保护构造函数)
          • 谁说实例化?编译器错误与 B 的 ctor 公开无关
          猜你喜欢
          • 2014-08-15
          • 1970-01-01
          • 2010-12-17
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2015-09-26
          • 2011-09-01
          相关资源
          最近更新 更多