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

Posted

技术标签:

【中文标题】命名空间内受保护的内部类编译没有错误【英文标题】:Protected internal class inside a namespace compiles without error 【发布时间】:2013-01-06 17:30:31 【问题描述】:
protected internal class foo

    //this compiles without any errors

还有

internal class bar

    public int quix;
    protected internal int zyx;
    //this compiles without any errors

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

解释:

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

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

【问题讨论】:

protected internal 表示protectedinternal protected internal 表示protected internal,这里没有错误:) 有什么问题?我看不出代码有什么问题。 Access Modifiers - MSDN阅读文章 Protected member visible for user的可能重复 【参考方案1】:

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

C#编译器说:

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

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

更新

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

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

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

【讨论】:

是的,这就是我要说的。但是我使用的编译器没有产生我觉得奇怪的错误(这是我的第一个问题)。 我正在使用特定版本的 Mono 并且没有产生错误。 @user206334 哦!!!如果您不将问题标记为单声道,您希望每个人都知道您正在使用单声道!???? 这是一个关于标准应该对这些案例说些什​​么的一般案例。这与 Mono 无关。我可以使用自制 DODO 编译器。 @user206334 每个编译器都会以自己的方式实现标准。约定如何确保任何实施者都做得很好??【参考方案2】:

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

更多信息/解释见haacked

回答您的问题:

    命名空间内(而不是另一个类)内的类只能声明为publicinternal但是,另一个类中的一个类可以声明为protected internalprivate等。

    是的,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; 
        
    
    

【讨论】:

这篇文章谈到了公共类成员的受保护内部,但是我的第一个问题是是否可以为命名空间中定义的类指定受保护的内部我>。我的第二个问题是公共或受保护的内部是否可以在访问修饰符比其成员的访问修饰符更严格的类中使用。 1) 所以这是我的编译器中的一个错误 2) 嗯,我明白了,但这很奇怪。我需要考虑如何访问嵌套私有类中的公共成员。 @user206334 1) 很难说没有看到您的完整代码,但我怀疑这是编译器问题。 2)具有公共成员的嵌套私有类的一个用例是公共接口的私有实现 我的完整代码已发布(两个不同的案例)。我明白这一点,但是可以在该私有类之外访问这些公共成员吗?我的想法是,如果我声明一个私有类,那么成员也应该/应该是私有的。 @user206334 私有类只能被父类访问。您是对的,在该范围之外将无法访问它们。除了我上面所说的满足接口之外,在私有类中拥有公共成员是一种非常罕见的用法。【参考方案3】:

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

【讨论】:

【参考方案4】:

在此引用MSDN entry:

受保护的内部

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

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

【讨论】:

【参考方案5】:

来自Access Modifiers (C# Programming Guide)

protected internal

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

【讨论】:

以上是关于命名空间内受保护的内部类编译没有错误的主要内容,如果未能解决你的问题,请参考以下文章

在命名空间中,如何定义从内部类返回对象的函数?

封装 继承

面向对象思想

面向对象思想

在不同的命名空间中定义基类和派生类时的编译错误

不是类或命名空间名称