为啥我收到“由于保护级别而无法访问”错误?

Posted

技术标签:

【中文标题】为啥我收到“由于保护级别而无法访问”错误?【英文标题】: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");
    

谁能解释一下原因?

【问题讨论】:

【参考方案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 公开无关

以上是关于为啥我收到“由于保护级别而无法访问”错误?的主要内容,如果未能解决你的问题,请参考以下文章

为啥我在尝试访问此 WordPress 网站时收到此 403 Forbidden 错误?为啥它无法读取 .htaccess 文件?

为啥我会收到此错误? UnknownEndpoint:无法访问的主机:`devicefarm.us-east-1.amazonaws.com'

为啥我收到 Apache 代理 503 错误?

为啥在使用 AJAX/PHP 时收到未定义索引错误?

为啥我收到“无法解析 NSPredicate”错误

为啥我收到“无法分配给操作员”错误?