【问题标题】:C#: constructor of nested class makes "inaccessible due to protection level"C#:嵌套类的构造函数使“由于保护级别而无法访问”
【发布时间】:2012-12-13 15:21:35
【问题描述】:

我有这段代码,并且产生了错误,只是因为我已经为它的类添加了一个构造函数。

class NestedClass
{
   class A
   {
      A() {}
   }

   class B
   {
       // no constructor
   }

   public static void run()
   {
     A a = new A();  // error
     B b = new B(); // no error
   }
}

错误是:

NestedExample.A is inaccessible due to protection level

请帮我解释一下。

谢谢:)

【问题讨论】:

    标签: c# .net class oop


    【解决方案1】:

    你的构造函数是private。类成员的默认访问修饰符是private

       class A
       {
          A() {}
       }
    

    这是正确的实现

       class A
       {
          public A() {}
       }
    

    【讨论】:

    • 谢谢。我来自java,所以我认为类成员的默认值是公共的:D
    • @hqt,我认为在Java中默认是package,在包内可见见this
    【解决方案2】:

    将构造函数定义为public

    public class A
    {
        public A() {}
    }
    

    【讨论】:

      【解决方案3】:

      将您的构造函数定义为公共的

      public A() { }
      

      A 类的构造函数是private

      Private Constructors (C# Programming Guide) - MSDN

      注意,如果你不使用构造函数的访问修饰符,它 默认情况下仍将是私有的。


      它对 B 起作用的原因是你没有指定任何构造函数和默认构造函数:

      Constructor - MSDN

      除非类是静态的,否则没有构造函数的类会被赋予一个 公共默认构造函数由 C# 编译器以启用类实例化

      【讨论】:

        【解决方案4】:

        让你的嵌套类public,问题就解决了。您的 run 方法是公开的,但您要使用的类不是公开的,这会带来问题。

        【讨论】:

        • 确实,您对只需要公开的构造函数是正确的。我的错。
        【解决方案5】:

        A 的构造函数是私有的。它不能从 A 外部访问。 同时,B 根本没有构造函数,因此获得了默认的公共构造函数。

        【讨论】:

          【解决方案6】:

          你需要指定,默认是私有的,而在B的情况下,编译器为你提供了一个公共的无参数构造函数。所以你必须为class A指定它

          class A
          {
              public A() { }
          }
          

          【讨论】:

            猜你喜欢
            • 2013-06-04
            • 2011-07-16
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 2016-11-07
            • 1970-01-01
            • 2019-04-21
            • 2015-09-26
            相关资源
            最近更新 更多