【问题标题】:protected internal class working within class but not working outside受保护的内部班级在班级内工作但不在班级外工作
【发布时间】:2012-09-06 09:16:48
【问题描述】:

我尝试了一些事情,想知道为什么会这样。

比如说,我在命名空间 n 中有一个名为 A 的类,我正在尝试创建受保护的内部类 B。

namespace n
{
   public class A
   {
      public A()
      {
      }
   }
   protected internal class B //throwing error
   {
   }
}

但是当我这样尝试时(B 作为 A 的子类),它不会抛出错误并且它是成功的。你能解释一下为什么会这样吗?

namespace n
{
   public class A
   {
      public A()
      {
      }
      protected internal class B // its not throwing error
      {
      }
   }      
}

理论上我是否遗漏了什么?有点混乱。

【问题讨论】:

    标签: c# oop internal protected


    【解决方案1】:

    查看错误。

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

    类外只允许内部或公共成员。

    您的第二种情况是将 B 类定义为 A 类的成员,这就是您没有收到错误的原因。

    你可能会看到Access Modifiers C#

    在命名空间中直接声明的类和结构(在 换句话说,没有嵌套在其他类或结构中)可以 要么是公开的,要么是内部的。如果没有访问权限,则默认为内部 指定了修饰符。

    【讨论】:

    • Sealed 还可以用作除 internal(默认修饰符)和 public 之外的类的类修饰符。
    【解决方案2】:

    一个类不能是protected,除非它在另一个类中。

    protected 关键字仅对类的成员有效。在您的第二个示例中,class B 恰好是该成员。

    想一想:
    protected 表示:派生类可以访问这个成员。
    由于没有派生命名空间这样的概念,protected 关键字对命名空间的成员没有意义。

    【讨论】:

      【解决方案3】:

      protected 声明 派生 类型的可见性级别。

      在您的第一种情况下,您在 namespace 中声明类。没有对命名空间的任何多态支持,因此在namespace 中没有任何使用受保护类的感觉

      在第二种情况下,您可以在其他类(A 类)中使用它,这使其对A 类的所有子类可见。

      【讨论】:

        猜你喜欢
        • 2011-08-09
        • 2019-10-11
        • 2019-04-26
        • 2022-01-14
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多