命名空间内受保护的内部类编译时没有错误

时间:2013-01-23 09:28:28

标签: c# .net mono internal protected

protected internal class foo
{
    //this compiles without any errors
}

internal class bar
{
    public int quix;
    protected internal int zyx;
    //this compiles without any errors
}

这些编译器错误或我对标准的错误解释?

说明:

  1. 类不能具有受保护的内部访问修饰符,只有公共或内部根据MSDN(直接在命名空间内声明的类和结构(换句话说,不嵌套在其他类或结构中)可以是公共的如果没有指定访问修饰符,则内部是默认值。
  2. 并非所有上下文中的所有类型或成员都可以使用所有访问修饰符,并且在某些情况下,类型成员的可访问性受其包含类型(MSDN)的可访问性的限制。公众应该失败。受保护的内部对我来说是不明确的 - 内部修饰符不是必需的。
  3. 编辑:我使用Mono的事实是不必要的,因为问题是关于标准说什么而不是MONO做什么或不做什么。也许我正在编写自己的编译器。这就是为什么我引用MSDN来准确说明允许的内容和不允许的内容。

5 个答案:

答案 0 :(得分:22)

正如我在上面的评论中所提到的,protected internal表示protected internal protected internal。这里没有错误:))

更多信息/说明在haacked

回答你的问题:

  1. 命名空间(而不是其他类)中的类只能声明为publicinternal HOWEVER ,其他类中的类可以声明为protected internalprivate等。

  2. 是的,protected internal可以在其访问修饰符比其成员更严格的类中使用,请参阅下面完全有效用法的示例(请注意该类位于{{ 1}} class ):

    Program

答案 1 :(得分:2)

来自Access Modifiers (C# Programming Guide)

protected internal
  

可以通过程序集中的任何代码访问类型或成员   它在另一个派生类中声明为   组装

答案 2 :(得分:2)

在此引用MSDN entry

  

受保护的内部

     

类型或成员可以由声明它的程序集中的任何代码访问,也可以从另一个程序集中的派生类中访问。来自另一个程序集的访问必须在一个类声明中进行,该声明派生自声明受保护的内部元素的类,并且它必须通过派生类类型的实例进行。

因此声明非常有意义,在课堂外使用时,它的工作方式与预期不同。

答案 3 :(得分:2)

此外,我真的怀疑"受保护和内部的课程"如果该类被声明为某个命名空间的成员,则会编译

C#编译器说:

  

命名空间中定义的元素不能显式声明为   私人,受保护或受保护的内部

受保护的类将始终是嵌套类!

更新

由于你在某些版本的Mono编译器中尝试了代码示例,并且在问题//this compiles without any errors中的示例代码中说过,我无法理解为什么你没有#&# 39; t为Mono标记了问题。

标准是Microsoft C#编译器行为。如果你问一个关于"为什么会编译某些内容的问题"并且你没有提到你没有使用官方的,你只是假设任何编译器都会编译你的代码。

您想知道哪个是标准吗?它的 - 再次 - :受保护的类将始终是嵌套类!

答案 4 :(得分:0)

关键字protected属于继承,关键字internal属于范围。