5
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(直接在命名空间中声明的类和结构(换句话说,未嵌套在其他类或结构中)的类和结构)只能是公共的或内部的,可以是公共的或内部的。如果未指定访问修饰符,则 Internal 是默认值)。
  2. 并非所有类型或成员都可以在所有上下文中使用所有访问修饰符,并且在某些情况下,类型成员的可访问性受到其包含类型 (MSDN) 的可访问性的限制。公众应该失败。受保护的内部对我来说是模棱两可的——内部修饰符不是必需的。

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

4

5 回答 5

22

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

更多信息/解释在被黑客攻击

针对您的问题:

  1. 命名空间中的类(而不是另一个类中)只能声明为publicorinternal但是,另一个类中的一个类可以声明为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; }
        }
    }
    
于 2013-01-23T09:30:21.967 回答
2

Access Modifiers (C# Programming Guide)

protected internal

类型或成员可以被声明它的程序集中的任何代码访问,也可以另一个程序集中的派生类中访问。

于 2013-01-23T09:33:40.090 回答
2

引用MSDN 条目

受保护的内部

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

所以这个声明非常有意义,它只是在类外使用时的工作方式与预期不同。

于 2013-01-23T09:33:48.297 回答
2

此外,我真的怀疑如果该类被声明为某个命名空间的成员,那么“受保护的内部类”是否会编译:

C#编译器说:

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

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

更新

由于您在某些版本的 Mono 编译器中尝试您的代码示例,并且您在问题的示例代码中说//this compiles without any errors,我不明白您为什么没有为 Mono 标记问题。

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

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

于 2013-01-23T09:34:52.287 回答
0

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

于 2013-01-23T09:34:59.783 回答