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

use*_*334 5 .net c# mono protected internal

protected internal class foo
{
    //this compiles without any errors
}
Run Code Online (Sandbox Code Playgroud)

internal class bar
{
    public int quix;
    protected internal int zyx;
    //this compiles without any errors
}
Run Code Online (Sandbox Code Playgroud)

是这些编译器错误还是我对标准的误解?

说明:

  1. 根据MSDN,类不能具有受保护的内部访问修饰符,只有公共或内部(直接在命名空间内声明的类和结构(换句话说,不嵌套在其他类或结构中)可以是公共的或内部的.如果未指定访问修饰符,则内部为默认值).
  2. 并非所有上下文中的所有类型或成员都可以使用所有访问修饰符,并且在某些情况下,类型成员的可访问性受其包含类型(MSDN)的可访问性的约束.公众应该失败.受保护的内部对我来说是不明确的 - 内部修饰符不是必需的.

编辑:我使用Mono的事实是不必要的,因为问题是关于标准说什么而不是MONO做什么或不做什么.也许我正在编写自己的编译器.这就是为什么我引用MSDN准确地说是允许什么和不允许什么.

mat*_*mmo 22

正如我在评论上面提到的,protected internal意味着protected internal protected internal.这里没有错误:)

有关进一步的信息/解释是haacked

回答你的问题:

  1. 命名空间(而不是另一个类)中的类只能声明为publicinternal.无论其,在另一个类中的一类可以声明为protected internal,private等等.

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

    public class Program
    {
        static void Main(string[] args)
        {
        }
    
        private class Foo
        {
            private int priv { get; set; }
            protected internal int protint { get; set; }
            public int pub { get; set; }
        }
    }
    
    Run Code Online (Sandbox Code Playgroud)