名称空间级别的枚举 - 仍然需要公开吗?

时间:2011-03-24 10:51:06

标签: c# delegates enums namespaces

我不确定为什么枚举必须公开才能与代表一起使用。我假设在命名空间级别上,整个应用程序都可以访问它,因为它在范围内。

namespace Test
{

  enum Days
  {
    Monday,Tuesday
  }

 class TestingClass
  {
    public delegate void DelTest(Days d)    /// ERROR, type enum is less accessible
  }
}

4 个答案:

答案 0 :(得分:3)

您的委托类型实际上是在internal类中声明,因此它也是有效地内部(在某种意义上,无论如何)。这就是为什么您的示例如图所示将编译(添加分号后)。为了让它破裂,你必须公开TestingClass。所以选项:

  • 如图所示
  • 如果您希望TestingClass为公共
  • ,请将委托明确设为内部
  • 如果您希望所有内容公开
  • ,请明确公开枚举

只是为了解释为什么在TestClass公开时你的当前代码会被破坏:委托是公开的,因此在当前程序集之外可见。这意味着它的所有参数和返回类型也必须可见。

不要忘记C#中成员的默认访问级别始终是“可以为该成员明确指定的最严格的访问级别” - 因此对于顶级类型(包括枚举),默认可访问性为internal

答案 1 :(得分:1)

  

我假设在命名空间级别上,整个应用程序都可以访问它

不,整个程序集可以访问它。默认访问级别为internal


修改:当我更改您的代码以使用公开类:

 enum Days { ... }
 public class TestingClass  { void M(Days d) {} }

我收到编译错误

  

可访问性不一致:参数类型'测试   .Days'比......更容易接近。

这就是@firefox所解释的:public方法中的参数类型也必须是public,以避免不一致。目前您的Days类型不太容易访问(internal)。

答案 2 :(得分:1)

您的枚举的可访问性必须与代理匹配。想想你将如何称呼它。

new TestingClass.DelTest(Days.Monday).Invoke();

为了能够从不同的程序集执行此操作,Days枚举必须是公共的。如果您不希望它是公开的,请更改委托的可访问性以匹配枚举的可访问性,例如将两者都设为内部。

答案 3 :(得分:1)

这段代码也适用于我,加上了半结肠。

“参数类型比委托更难访问”的错误只会在引发类可访问性时出现,因为目前它们是使用相同的可访问性级别定义的。

e.g。

namespace Test
{
    enum Days
    {
        Monday, Tuesday
    }

    public class TestingClass
    {
        public delegate void DelTest(Days d);    // This will produce an error...
    }
}