我已经得到了下面的代码,我正在尝试进行一些继承练习,但是当我尝试运行此代码时,它给了我一个错误:
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");
}
}
有人能帮助我吗?
答案 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?中给出了详细的解释,引用如下(带有小编辑):
PS:有人说,有人可能会说,编译器可能会坚持使用&#34;其中一只手&#34;它仍然是确定性的。那么为什么设计决策不是以特定的方式选择的呢?对于这样一个后续问题,答案是,这一切都归结为设计哲学(再次引用Eric的博客文章):一方面,它是基类的公共方法,因此它似乎应该是可访问的(对于派生类也是如此)。另一方面,Base是内部的事实证明其内部方法应该在程序集之外是不可访问的。 C#的一个基本设计原则是,当意图不明确时,编译器会因失败而引起注意。
这种语言规则鼓励您使用继承关系来建模业务域语义,而不是作为代码重用的机制。
这就是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)
这个问题的一个可能原因可能是,你有多个主要课程,确保你只有一个主要课程。