我有以下C#代码:
namespace ISeeOptic.BL
{
public abstract class Process
{
...
protected static void DeleteImages(List<ImagesPath> list)
{
some logic
}
...
}
protected class GetDataBL: Process
{
...
public static void DeleteImages(List<ImagesPath> list)
{
DeleteImages(list);
}
...
}
}
在编译时我收到以下错误:
命名空间中定义的元素无法显式声明为private,protected或protected internal
我是C#的初学者所以也许这个问题可能看起来很幼稚, 知道导致这个错误的原因是什么?
谢谢你提前。
答案 0 :(得分:33)
命名空间中定义的元素可以显式声明为public或internal。
它们可能不会被显式声明为私有或受保护(或受保护的内部),因为这些修饰符仅对类的成员有意义。
例如,你的protected class GetDataBL
毫无意义,因为“protected”意味着“从包含类继承的类可以访问” - 但是没有包含GetDataBL的类。
答案 1 :(得分:12)
答案 2 :(得分:8)
(我相信你实际上会得到一个编译时错误;如果你只是在执行时看到这个,那么你的代码也可能在执行时被编译,例如as Web应用程序的一部分。从逻辑上讲,它是编译时错误,不是例外。)
protected
访问修饰符(松散地)使派生的包含类型可以访问成员;但在名称空间成员的情况下, 不包含类型。
同样,私有成员的辅助功能域是包含类型的程序文本 - 同样, 不包含类型。
通过使GetDataBL
受到保护,您实际上想要实现的是什么?
答案 3 :(得分:3)
正如错误所解释的那样导致错误的元素的范围 - 以及C#规范(ECMA第10.5.1节):
- 在编译单元或名称空间中声明的类型可以
public
或internal
声明可访问性,并且默认为internal
声明的可访问性。- 类成员可以具有五种声明的可访问性中的任何一种,并且默认为
private
声明的可访问性。- 结构成员可以
public
,internal
或private
声明可访问性,并且默认为private
声明的可访问性,因为结构是隐式密封的。
答案 4 :(得分:1)
在类Private,受保护和受保护的内部访问中,在命名空间级别不允许使用说明符。
只有允许的说明者在课堂上是公开的和内部的。
仅允许子类使用private,protected或protected内部访问说明符。
示例代码
internal class ParentClass
{
public string test()
{
return "This is the parent class function";
}
private class BaseChildClass
{
protected string childtest()
{
return "This is the parent class function";
}
}
private class DerivedChildClass : BaseChildClass
{
private void test1()
{
string test = base.childtest();
}
}
}