为啥我收到“由于保护级别而无法访问”错误?
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
上的构造函数更改为protected
或public
,如果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'