不一致的可访问性:基类比类不易访问

我已经得到了下面的代码,我正在尝试进行一些inheritance练习,但是当我尝试运行此代码时,它给出了一个错误:

Inconsistent Accessability: Base Class is less accessible than class 

代码:

 class Program { static void Main() { FoodProducts Test = new FoodProducts(); Test.Limit(); } } public class FoodProducts : Products { public void FoodProduct() { Console.WriteLine("This is food product"); } public void Limit() { Console.WriteLine("This is an Attribute of a Product"); } } 

有人能帮助我吗?

错误是什么行,具体的错误文本是什么? 此外, Products的定义在哪里?

您可能正在获得CS0060 :“不一致的可访问性:基类’class1’比类’class2’更难访问”因此,我假设您的Products类未标记为public

当基类被标记为public (例如internal )之外的其他内容时会发生此问题,但是您尝试创建public派生类。

仅仅为了像我这样厚厚的人的未来参考,我在以下情况下得到了这个并且无法弄清楚出了什么问题:

 public class Foo : Base {} <-- Inconsistent accessibility public class Base {} 

我花了一段时间才知道罪魁祸首在这里:

 internal class Bar {} 

可能该类Products不公开。 将public添加到Products类定义中。

如果你有类似的东西:

 class Products { ... } 

C#编译器将Products类解释为internal。

public指令添加到您尝试inheritance的类中。

这里有很多答案建议将你的基类改为公开。 从某种意义上说它们是正确的,但是它们会错过一个同样有效的替代方法,即将派生类更改为内部类(以匹配基类的可访问性)。

因此,真正(但简短)的答案是让您的基类和派生类具有相同的可访问性。

对于那些想知道原因的人来说 ,长期的答案是:当一个公共派生类试图inheritance一个内部或私有基类时,它可以说(后面会更多)在语义上不清楚子类是否也想暴露那些公众内部/私有基类中的方法。 Eric Lippert在他的博客文章中详细解释了:为什么从内部类派生公共课是非法的? ,引用如下(带有次要编辑):

一方面,它是基类的公共方法,因此它似乎应该是可访问的(对于派生类也是如此)。 另一方面,Base是内部的事实certificate其内部方法应该在程序集外部不可访问。 C#的一个基本设计原则是,当意图不清楚时,编译器会因失败而引起注意。

PS:话虽这么说,有人可能会说,编译器可能只是坚持“这两只手中的一只”,它仍然是确定性的。 那么为什么设计决策不是以特定的方式选择的呢? 对于这样的后续问题,答案是,这一切都归结为设计哲学(再次引自Eric的博客文章):

这种语言规则鼓励您使用inheritance关系来建模业务域语义,而不是作为代码重用的机制。

这就是C#已经做出的选择。

最后,为了完整起见,值得一提的是,上面的设计理念不一定是使用inheritance的普遍和唯一的方法。 (哎呀,其他一些语言甚至没有公共/内部概念,它们仍然是成功的)。 我个人认为,如果我们还想使用inheritance机制进行代码重用,我认为没有错。 但是C#已经选择仅将inheritance用于业务域语义。 所以,它就是这样。

 public class Products 

让你上课(如上所示),以便inheritance或访问它。

例如,当基类是私有的,但派生类是公共的时,就会发生这种情况。 一个矛盾,可以这么说。

这意味着如果您希望公共子课程,则父课程也必须公开。

这个问题的一个可能原因可能是,你有多个主要类,确保你只有一个主类。