protected internal class foo
{
//this compiles without any errors
}
也
internal class bar
{
public int quix;
protected internal int zyx;
//this compiles without any errors
}
这些编译器错误或我对标准的错误解释?
说明:
编辑:我使用Mono的事实是不必要的,因为问题是关于标准说什么而不是MONO做什么或不做什么。也许我正在编写自己的编译器。这就是为什么我引用MSDN来准确说明允许的内容和不允许的内容。
答案 0 :(得分:22)
正如我在上面的评论中所提到的,protected internal
表示protected
或 internal
不 protected
和 internal
。这里没有错误:))
更多信息/说明在haacked
回答你的问题:
命名空间(而不是其他类)中的类只能声明为public
或internal
。 HOWEVER ,其他类中的类可以声明为protected internal
,private
等。
是的,protected internal
可以在其访问修饰符比其成员更严格的类中使用,请参阅下面完全有效用法的示例(请注意该类位于{{ 1}} class ):
Program
答案 1 :(得分:2)
答案 2 :(得分:2)
在此引用MSDN entry:
受保护的内部
类型或成员可以由声明它的程序集中的任何代码访问,也可以从另一个程序集中的派生类中访问。来自另一个程序集的访问必须在一个类声明中进行,该声明派生自声明受保护的内部元素的类,并且它必须通过派生类类型的实例进行。
因此声明非常有意义,在课堂外使用时,它的工作方式与预期不同。
答案 3 :(得分:2)
此外,我真的怀疑"受保护和内部的课程"如果该类被声明为某个命名空间的成员,则会编译:
C#编译器说:
命名空间中定义的元素不能显式声明为 私人,受保护或受保护的内部
受保护的类将始终是嵌套类!
由于你在某些版本的Mono编译器中尝试了代码示例,并且在问题//this compiles without any errors
中的示例代码中说过,我无法理解为什么你没有#&# 39; t为Mono标记了问题。
标准是Microsoft C#编译器行为。如果你问一个关于"为什么会编译某些内容的问题"并且你没有提到你没有使用官方的,你只是假设任何编译器都会编译你的代码。
您想知道哪个是标准吗?它的 - 再次 - :受保护的类将始终是嵌套类!
答案 4 :(得分:0)
关键字protected
属于继承,关键字internal
属于范围。