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

时间:2012-08-27 02:48:50

标签: c# 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");
    }

}

有人能帮助我吗?

10 个答案:

答案 0 :(得分:13)

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

你可能得到CS0060:“不一致的可访问性:基类'class1'比类'class2'更难访问”因此,我假设你的Products类没有标记为{{ 1}}。

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

答案 1 :(得分:8)

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

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

public class Base<T> {}

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

internal class Bar {}

答案 2 :(得分:5)

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

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

对于those who wonder why,长答案是:当一个公共派生类试图继承一个内部或私有基类时,它可以说(后面会更多)在语义上不清楚子类是否也想要在内部/私有基类中公开这些公共方法。 Eric Lippert在他的blog post: Why is deriving a public class from an internal class illegal?中给出了详细的解释,引用如下(带有小编辑):

  

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

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

  

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

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

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

答案 3 :(得分:3)

班级Products可能不公开。将public添加到Products类定义。

如果你有类似的话:

class Products {
 ...
}

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

答案 4 :(得分:2)

public指令添加到您要继承的类中。

答案 5 :(得分:0)

public class Products

让您上课(如上所示),以便继承或访问。

答案 6 :(得分:0)

您也可以在基类中的命名空间定义之前添加它(紧跟在最后一个“using ...”行之后):

alter table table_1 start_date_dt as
    ( convert(datetime, left(start_date, 10), 105) + convert(datetime, right(start_date, 5)) )

答案 7 :(得分:-1)

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

答案 8 :(得分:-1)

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

答案 9 :(得分:-1)

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