12

我有下面的代码,我正在尝试做一些继承练习,但是当我尝试运行此代码时,它给了我一个错误:

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");
    }

}

有人可以帮助我吗?

4

10 回答 10

21

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

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

当基类被标记为public(internal例如) 以外的东西时,就会发生此问题,但随后您尝试创建public派生类。

于 2012-08-27T02:52:43.617 回答
17

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

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

public class Base<T> {}

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

internal class Bar {}
于 2016-08-16T13:11:05.923 回答
12

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

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

对于那些想知道为什么的人,长答案是:当一个公共派生类试图继承一个内部或私有基类时,可以说(稍后会详细介绍)在语义上变得不清楚子类是否也想要公开这些公共内部/私有基类中的方法。Eric Lippert 在他的博文中给出了详细的解释:为什么从内部类派生公共类是非法的?,引用如下(稍作修改):

一方面,它是基类的公共方法,因此它似乎应该是可访问的(派生类也是如此)。另一方面, Base 是 internal 的事实证明它的 internal 方法应该在程序集之外是不可访问的。C# 的一个基本设计原则是,当意图不明确时,编译器会通过失败来提醒您注意这一事实。

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

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

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

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

于 2018-05-22T23:28:01.553 回答
4

可能课程Products不是公开的。添加publicProducts类定义。

如果你有类似的东西:

class Products {
 ...
}

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

于 2012-08-27T02:52:33.087 回答
3

public指令添加到您尝试继承的类。

于 2012-08-27T02:57:38.107 回答
0
public class Products

使您的类公开(如上所示),以便它可以被继承或访问。

于 2013-07-18T10:44:45.477 回答
0

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

[assembly: InternalsVisibleTo("<name of the assembly of the caller class>")]
于 2021-02-08T16:54:52.050 回答
-1

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

于 2012-08-27T03:34:36.247 回答
-1

这意味着如果您希望有一个公共子类,则父类也必须是公共的。

于 2014-10-28T08:08:37.827 回答
-1

此问题的可能原因之一可能是,您有多个主要课程,请确保您只有一个主要课程。

于 2017-09-19T08:46:38.470 回答